避免 WP-PostViews 对分页文章多次统计点击次数

本文仅对通过 WordPress 内置的分页功能实现的分页文章进行讨论

安装了 WP-PostViews 插件来统计和显示文章的点击次数。个人认为对于一篇被分页的文章,不论是否访问到完整篇文章的所有页面点击次数最多应该只计一次。不过 PostViews 却并非如此计算,例如一篇文章被分成了 3 页,不管阅读第一页、第二页还是第三页,PostViews 都会视为对该篇文章有了一次有效点击。为了避免这个问题,对插件作了一些修改。

访问文章的途径无非两种,直接访问和通过链接访问。我们需要做的就是通过 HTTP_REFERER 判断上一个访问页面是否和当前访问页面属同一文章,若是则不计点击数。为了方便判断,可以分成以下几种情况:

  • 从第一页访问其它页面
  • 从其它页面访问第一页
  • 非第一页页面之间访问

打开 postviews.php(), 在函数 process_postviews() 中找到 if($should_count) { ,在这一行之前添加以下代码:

// 文章内容数组
global $pages;
// 当前文章页码
global $page;
// 如果使用了 WP 内置标签 
if (count($pages) > 1) {
  $pv_home = get_option('home');
  $pv_server = $_SERVER["SERVER_NAME"];
  $pv_referer = rtrim(wp_get_referer(), '/');
  $pv_req_url = rtrim('http://'.
    $_SERVER["HTTP_HOST"].
    $_SERVER["REQUEST_URI"], '/');
  /*
    判断页面来源
    因永久链接不同 WordPress 对文章的分页导航链接有两种处理方式:
    (a) yourdomain.com/?p={post_id}[&page={page}]
    (b) yourdomain.com/{your_permalink_structure}/[page]
    故判断条件既有区别也有一致的地方
  */
  if ($pv_referer && find_str($pv_referer, $pv_server)) {
    if (
      // 1.从第一页访问其它页, 适用 (a) 和 (b)
      (find_str($pv_req_url, $pv_referer)
           && $pv_referer != $pv_home) ||   

      // 2.从其它页访问第一页, 适用 (a) 和 (b)
      ($page == 1 && find_str($pv_referer, $pv_req_url)) ||   

      // 3.非第一页页面之间访问, 适用 (b)
      (remove_pagenum($pv_refer) == remove_pagenum($pv_req_url)
           && '' != get_option('permalink_structure')) ||  

      // 包含 2,3 两种情况, 适用 (a)
      find_str($pv_referer, '&page=')
     ) {
      $should_count = false;
    }
  }
}

还需 postviews.php 文件中添加以上代码中用到的函数:

// 查找字符串
function find_str($string, $findme) {
  return !(strpos($string, $findme)===FALSE);
}
// 去掉链接尾部的页码,仅用于采用非默认永久链接样式情况
function remove_pagenum($url) {
  if (is_numeric(substr(strrchr($url, '/'),1)))
    return substr($url, 0, strrpos($url, '/'));
  else
    return $url;
}

避免 WP-PostViews 对分页文章多次统计点击次数》上有5条评论

  1. tsian

    你为了cos-html-cache修改了内文分页的规则,从 xx.html/2 到了 xx-2.html。
    那你这里面用到的remove_pagenum,会不会冲突。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注