Prevent multiple counts by same user – WP PostViews plugin

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.

Leave a Comment