避免 WP-PostViews 对分页文章多次统计点击次数
本文仅对通过 WordPress 内置的分页功能实现的分页文章进行讨论
安装了 WP-PostViews 插件来统计和显示文章的点击次数。个人认为对于一篇被分页的文章,不论是否访问到完整篇文章的所有页面点击次数最多应该只计一次。不过 PostViews 却并非如此计算,例如一篇文章被分成了 3 页,不管阅读第一页、第二页还是第三页,PostViews 都会视为对该篇文章有了一次有效点击。为了避免这个问题,对插件作了一些修改。
访问文章的途径无非两种,直接访问和通过链接访问。我们需要做的就是通过 HTTP_REFERER 判断上一个访问页面是否和当前访问页面属同一文章,若是则不计点击数。为了方便判断,可以分成以下几种情况:
- 从第一页访问其它页面
- 从其它页面访问第一页
- 非第一页页面之间访问
打开 postviews.php(), 在函数 process_postviews() 中找到 if($should_count) { ,在这一行之前添加以下代码:
// 文章内容数组 global $pages; // 当前文章页码 global $page; // 如果使用了 WP 内置标签 <!-- nextpage--> 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; }
Comments
如饥似渴啊,全是我想要的。
如果不用你的方法,我每次分页浏览计数3次,ft。
加了你的代码,我每次分页浏览计数1次。
晕倒
范例:
http://www.21percent.com.cn/ps/html/2007/43.html
我用的是cos的js版wp-postviews
你为了cos-html-cache修改了内文分页的规则,从 xx.html/2 到了 xx-2.html。
那你这里面用到的remove_pagenum,会不会冲突。
@tsian: 啊。。这个我修改代码应该只对原版的wp-postviews有效
Leave a Reply