wp-postviews的防刷新的处理
wp-postviews是很好用的一款用来统计每篇文章pv(page view)的插件,还能在sidebar提供一个top view的小工具,十分赞,是为数不多的wordpress博客必备的插件之一。不过它有一个不足,就是pv不防刷新,即你对同一篇文章短时间内刷新几次,就是几个pv,而这样的pv是毫无意义的,就起了个念头来改善一下。
很显然,要记录访问者短时间内访问的每一篇文章,cookie是必须出场的,当然记录的是每篇文章的post id号。能读取到cookie中的所有已阅的文章id,就可以控制是否对此文章的pv更新+1了,在wp-postviews的wp-postviews.php里的process_postviews()函数里插入一个自己的判断函数即可。
然后一个很大的问题就是何时写入cookie并点击新文章时更新cookie,在wp-postviews.php里面是不行的,因为前面已经有输出了,此处不能写入cookie,比较棘手。然后在主题的single.php试了一下,居然可以,那就在这里写cookie吧。由于在主题的大循环(single.php的显示文章部分)外,无法使用get_the_ID()这个API,而基本上所有的博客都会采用路径重写,而不是默认的/?p=id这种形式,后来发现,在single.php可以使用一个$posts的全局变量,里面有本次请求的基本参数,不了解的同学去print_r()就知道啦,解决了文章id的获取,就可以使用setcookie来写入和更新cookie了。
试了一下基本没问题,IE、FF、Chrome都支持。很奇怪的一点,为什么single.php是可以操纵写入cookie呢?照理来说,这个文件之前已经有HTML输出了,是应该不能写cookie的,而且我尝试在single.php和wp-postviews.php 2个文件的顶端同时调用exit(),是后者的先出来。这说明先调到了插件计数,然后再显示页面的,但却前面的不能写cookie,后面的反而可以,疑惑了…不知道wordpress是怎么处理的
技术部分就到这儿了,另外发现一个奇怪的地方,仅在于Firefox。进入一篇文章的页面,居然cookie里面有2个id,后来发现第二个id是此篇文章的下一篇,即head中<link rel=’next’ />标签。百度后发现,浏览器会根据这标签提前加载页面,相当于同时打开了2篇文章。个人感觉这个功能很鸡肋,起码在wordpress中是如此,看那篇文章完全是因为文章的内容来吸引访问者,又不是RSS,按顺序一篇一篇读下去。不知道算是FF的一个优势还是一个败笔。
贴一下代码:
wp-postviews.php的process_postviews()中$post初始化后添加2行:
1 2 | if(check_cookie($post)) return; |
wp-postviews.php加入函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function check_cookie($post){ $COOKNAME = 'CookieViews'; $cookie = $_COOKIE[$COOKNAME]; $id = $post->ID; if(empty($id)){ return false; } if(!empty($cookie)){ $list = explode('a', $cookie); if(!empty($list) && in_array($id, $list)){ return true; } } return false; } |
single.php写cookie部分,放在最顶端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $COOKNAME = 'CookieViews'; $TIME = 3600 * 24; $PATH = '/'; $id = $posts[0]->ID; $expire = time() + $TIME; $cookie = $_COOKIE[$COOKNAME]; if(empty($cookie)){ setcookie($COOKNAME, $id, $expire, $PATH); } else{ $list = explode('a', $cookie); if(!in_array($id, $list)){ setcookie($COOKNAME, $cookie.'a'.$id, $expire, $PATH); } } |
好像有个add_filter的东西,可以把自己写的代码挂载到wp_head();函数里。貌似这样才能写cookie。
对于访问量本来就不高的我来说 还是飘过
一起加油!