防止同一用户进行多次计数-WP PostViews插件

时间:2013-06-26 作者:whiteletters in blankpapers

我正在使用WP Post Views 显示帖子视图数的插件。为此,我使用:

<?php if(function_exists(\'the_views\')) { the_views(); } ?>
The problem is: 如果用户只是刷新帖子页面,插件会增加帖子视图的数量。如果特定用户的视图数量只增加一次,那就好了。

谢谢你抽出时间。非常感谢您一如既往的帮助。

指向代码源的链接为:http://plugins.trac.wordpress.org/browser/wp-postviews/trunk/wp-postviews.php

Note:

在SE社区的帮助下,我已经使用以下黑客方法排除了帖子作者的观点:

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);
但我无法使用相同的逻辑排除同一用户的多个计数。

2 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

由于插件作者没有为我们提供任何操作或过滤器,因此我们只能满足于“倾听”对views 改为元字段。

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 );
现在发生的是views 修改后,我们将当前帖子ID添加到当前用户的“视图堆栈”,然后将其另存为cookie。

有了这个功能,我们现在可以检查用户是否已经查看了帖子,如果已经查看了,请防止再次保存他们的查看次数。

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\' );
}
将最后一段代码放在remove_view_counter_wpse_102637 作用

SO网友:Mahsa Khodaei

用以下代码替换函数:

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); 

结束