WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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


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 (
    && !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.

share|improve this question
up vote 1 down vote accepted

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' ] ) );
            $viewed = array();

        $viewed[] = $object_id;
            USER_COOKIE . '_views',
                ',', $viewed
            time() + 31536000,

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.

share|improve this answer
I thank you very much. I read the codes you provided and I clearly see that the logic behind will surely resolve my problem. I will implement this and come back to accept. – whiteletters in blankpapers Jun 26 '13 at 16:25
this is working perfectly, I am really thanking you for the solution and for the cookies science I learned from it. Good luck in your projects. – whiteletters in blankpapers Jun 26 '13 at 17:00
How can I solve the "Cannot modify header information - headers already sent by " warning caused by your suggested code. Thank you – whiteletters in blankpapers Oct 24 '13 at 18:17

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.