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中标签。百度后发现,浏览器会根据这标签提前加载页面,相当于同时打开了2篇文章。个人感觉这个功能很鸡肋,起码在wordpress中是如此,看那篇文章完全是因为文章的内容来吸引访问者,又不是RSS,按顺序一篇一篇读下去。不知道算是FF的一个优势还是一个败笔。

贴一下代码:
wp-postviews.php的process_postviews()中$post初始化后添加2行:

if(check_cookie($post))
	return;

wp-postviews.php加入函数:

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部分,放在最顶端

$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);
	}
}

你可能感兴趣的:(PHP)