Prevent multiple counts by same user – WP PostViews plugin

The question:

I am using WP Post Views plugin to display the post number of views. To do so, I use:

<?php if(function_exists('the_views')) { the_views(); } ?>

The problem is: The plugin increments the number of a post views if the user just refreshes the post page. It will be good if the number of views increase only one time for a specific user.

I thank you for your time.Your usual help is always appreciated.

The link to the code source is :http://plugins.trac.wordpress.org/browser/wp-postviews/trunk/wp-postviews.php

Note:

I already managed, with the help of SE community, to exclude the views by post author using the following hack:

function remove_view_counter_wpse_102637() {
  global $post;
  $current_user = wp_get_current_user();

  if (
    is_single() 
    && !empty($current_user)
    && $post->post_author == $current_user->ID
  ) {
    remove_action('wp_head', 'process_postviews');
  }
}
add_action('wp_head', 'remove_view_counter_wpse_102637',1);

But I cannot manage to exclude the multiple counts by same user using the same logic.

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

Since the plugin author does not offer any actions or filters for us to hook onto, we’ll have to settle for “listening” to changes to the views meta field instead.

function wpse_104324_prevent_multiple_views( $meta_id, $object_id, $meta_key, $meta_value ) {
    if ( $meta_key === 'views' ) {
        if ( ! empty( $_COOKIE[ USER_COOKIE . '_views' ] ) )
            $viewed = array_map( 'intval', explode( ',', $_COOKIE[ USER_COOKIE . '_views' ] ) );
        else
            $viewed = array();

        $viewed[] = $object_id;
        setcookie(
            USER_COOKIE . '_views',
            implode(
                ',', $viewed
            ),
            time() + 31536000,
            COOKIEPATH,
            COOKIE_DOMAIN,
            false,
            true
        );
    }
}

add_action( 'updated_post_meta', 'wpse_104324_prevent_multiple_views', 10, 4 );
add_action( 'added_post_meta',   'wpse_104324_prevent_multiple_views', 10, 4 );

What happens now, is that whenever views is modified, we add the current post ID to the current user’s “view stack”, then save it as a cookie.

With this in place, we can now check to see if a user has already viewed the post, and if so, prevent their view count from being saved again.

if ( ! empty( $_COOKIE[ USER_COOKIE . '_views' ] ) ) {
    $viewed = array_map( 'intval', explode( ',', $_COOKIE[ USER_COOKIE . '_views' ] ) );
    if ( in_array( $post->ID, $viewed ) )
        remove_action( 'wp_head', 'process_postviews' );
}

Put this last code snippet inside the remove_view_counter_wpse_102637 function.

Method 2

replace your function by following code :

function remove_view_counter_wpse_102637() {
if ( ! empty( $_COOKIE[ USER_COOKIE . '_views' ] ) ) {
    $viewed = array_map( 'intval', explode( ',', $_COOKIE[ USER_COOKIE . '_views' ] ) );
    if ( in_array( $post->ID, $viewed ) )
        remove_action( 'wp_head', 'process_postviews' );
}
global $post;
$current_user = wp_get_current_user();

if (
  is_single() 
  && !empty($current_user)
  && $post->post_author == $current_user->ID
) {
  remove_action('wp_head', 'process_postviews');
}
}
add_action('wp_head', 'remove_view_counter_wpse_102637',1); 


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment