wordpress 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行:
- <span style=”color:#b1b100″>if</span><span style=”color:#009900″>(</span>check_cookie<span style=”color:#009900″>(</span><span style=”color:#000088″>$post</span><span style=”color:#009900″>)</span><span style=”color:#009900″>)</span>
- <span style=”color:#b1b100″>return</span><span style=”color:#339933″>;</span>
wp-postviews.php加入函数:
- <span style=”color:#000000; font-weight:bold”>function</span> check_cookie<span style=”color:#009900″>(</span><span style=”color:#000088″>$post</span><span style=”color:#009900″>)</span><span style=”color:#009900″>{</span>
- <span style=”color:#000088″>$COOKNAME</span> <span style=”color:#339933″>=</span> <span style=”color:#0000ff”>’CookieViews'</span><span style=”color:#339933″>;</span>
- <span style=”color:#000088″>$cookie</span> <span style=”color:#339933″>=</span> <span style=”color:#000088″>$_COOKIE</span><span style=”color:#009900″>[</span><span style=”color:#000088″>$COOKNAME</span><span style=”color:#009900″>]</span><span style=”color:#339933″>;</span>
- <span style=”color:#000088″>$id</span> <span style=”color:#339933″>=</span> <span style=”color:#000088″>$post</span><span style=”color:#339933″>-></span><span style=”color:#004000″>ID</span><span style=”color:#339933″>;</span>
- <span style=”color:#b1b100″>if</span><span style=”color:#009900″>(</span><span style=”color:#990000″>empty</span><span style=”color:#009900″>(</span><span style=”color:#000088″>$id</span><span style=”color:#009900″>)</span><span style=”color:#009900″>)</span><span style=”color:#009900″>{</span>
- <span style=”color:#b1b100″>return</span> <span style=”color:#009900; font-weight:bold”>false</span><span style=”color:#339933″>;</span>
- <span style=”color:#009900″>}</span>
- <span style=”color:#b1b100″>if</span><span style=”color:#009900″>(</span><span style=”color:#339933″>!</span><span style=”color:#990000″>empty</span><span style=”color:#009900″>(</span><span style=”color:#000088″>$cookie</span><span style=”color:#009900″>)</span><span style=”color:#009900″>)</span><span style=”color:#009900″>{</span>
- <span style=”color:#000088″>$list</span> <span style=”color:#339933″>=</span> <span style=”color:#990000″>explode</span><span style=”color:#009900″>(</span><span style=”color:#0000ff”>’a'</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$cookie</span><span style=”color:#009900″>)</span><span style=”color:#339933″>;</span>
- <span style=”color:#b1b100″>if</span><span style=”color:#009900″>(</span><span style=”color:#339933″>!</span><span style=”color:#990000″>empty</span><span style=”color:#009900″>(</span><span style=”color:#000088″>$list</span><span style=”color:#009900″>)</span> <span style=”color:#339933″>&&</span> <span style=”color:#990000″>in_array</span><span style=”color:#009900″>(</span><span style=”color:#000088″>$id</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$list</span><span style=”color:#009900″>)</span><span style=”color:#009900″>)</span><span style=”color:#009900″>{</span>
- <span style=”color:#b1b100″>return</span> <span style=”color:#009900; font-weight:bold”>true</span><span style=”color:#339933″>;</span>
- <span style=”color:#009900″>}</span>
- <span style=”color:#009900″>}</span>
- <span style=”color:#b1b100″>return</span> <span style=”color:#009900; font-weight:bold”>false</span><span style=”color:#339933″>;</span>
- <span style=”color:#009900″>}</span>
single.php写cookie部分,放在最顶端
- <span style=”color:#000088″>$COOKNAME</span> <span style=”color:#339933″>=</span> <span style=”color:#0000ff”>’CookieViews'</span><span style=”color:#339933″>;</span>
- <span style=”color:#000088″>$TIME</span> <span style=”color:#339933″>=</span> <span style=”color:#cc66cc”>3600</span> <span style=”color:#339933″>*</span> <span style=”color:#cc66cc”>24</span><span style=”color:#339933″>;</span>
- <span style=”color:#000088″>$PATH</span> <span style=”color:#339933″>=</span> <span style=”color:#0000ff”>’/'</span><span style=”color:#339933″>;</span>
- <span style=”color:#000088″>$id</span> <span style=”color:#339933″>=</span> <span style=”color:#000088″>$posts</span><span style=”color:#009900″>[</span><span style=”color:#cc66cc”>0</span><span style=”color:#009900″>]</span><span style=”color:#339933″>-></span><span style=”color:#004000″>ID</span><span style=”color:#339933″>;</span>
- <span style=”color:#000088″>$expire</span> <span style=”color:#339933″>=</span> <span style=”color:#990000″>time</span><span style=”color:#009900″>(</span><span style=”color:#009900″>)</span> <span style=”color:#339933″>+</span> <span style=”color:#000088″>$TIME</span><span style=”color:#339933″>;</span>
- <span style=”color:#000088″>$cookie</span> <span style=”color:#339933″>=</span> <span style=”color:#000088″>$_COOKIE</span><span style=”color:#009900″>[</span><span style=”color:#000088″>$COOKNAME</span><span style=”color:#009900″>]</span><span style=”color:#339933″>;</span>
- <span style=”color:#b1b100″>if</span><span style=”color:#009900″>(</span><span style=”color:#990000″>empty</span><span style=”color:#009900″>(</span><span style=”color:#000088″>$cookie</span><span style=”color:#009900″>)</span><span style=”color:#009900″>)</span><span style=”color:#009900″>{</span>
- <span style=”color:#990000″>setcookie</span><span style=”color:#009900″>(</span><span style=”color:#000088″>$COOKNAME</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$id</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$expire</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$PATH</span><span style=”color:#009900″>)</span><span style=”color:#339933″>;</span>
- <span style=”color:#009900″>}</span>
- <span style=”color:#b1b100″>else</span><span style=”color:#009900″>{</span>
- <span style=”color:#000088″>$list</span> <span style=”color:#339933″>=</span> <span style=”color:#990000″>explode</span><span style=”color:#009900″>(</span><span style=”color:#0000ff”>’a'</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$cookie</span><span style=”color:#009900″>)</span><span style=”color:#339933″>;</span>
- <span style=”color:#b1b100″>if</span><span style=”color:#009900″>(</span><span style=”color:#339933″>!</span><span style=”color:#990000″>in_array</span><span style=”color:#009900″>(</span><span style=”color:#000088″>$id</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$list</span><span style=”color:#009900″>)</span><span style=”color:#009900″>)</span><span style=”color:#009900″>{</span>
- <span style=”color:#990000″>setcookie</span><span style=”color:#009900″>(</span><span style=”color:#000088″>$COOKNAME</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$cookie</span><span style=”color:#339933″>.</span><span style=”color:#0000ff”>’a'</span><span style=”color:#339933″>.</span><span style=”color:#000088″>$id</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$expire</span><span style=”color:#339933″>,</span> <span style=”color:#000088″>$PATH</span><span style=”color:#009900″>)</span><span style=”color:#339933″>;</span>
- <span style=”color:#009900″>}</span>
- <span style=”color:#009900″>}</span>