避免 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;
}
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