Prevent multiple counts by same user – WP PostViews plugin

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.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

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

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x