解决网站静态缓存后WP-PostViews插件不计数的问题

突然发现文章浏览计数功能失效了,文章发了几个月才几十上百的浏览数,本以为是因为最近发的文章都比较冷门,不受欢迎。但是发布了几个月,才不到 2 百的访问量,这就不合理了。

一、发现问题

于是花时间分析了下,结果一查网站日志,发现浏览计数的请求居然一个都没有。。。

由于网站开启了纯静态缓存(nginx_fastcgi_cache),所以 wp-postviews 的计数方式会自动改为 ajax 提交方式,正常情况下,Nginx 日志里面会出现如下请求记录:

/wp-admin/admin-ajax.php?postviews_id=xxxx&action=postviews&_=xxxxxxxxxx

而我翻看了最近半个月的 Nginx 日志,只有寥寥数条,看来确实有情况。

二、解决问题

首先,我打开了一篇文章,按下 F12,再刷新该页面,在 NetWork 内容中搜索我熟悉的 admin-ajax,发现没有记录,甚至搜索 php 关键词都没有任何请求记录,直接在页面源码中搜索关键词也是一无所获,看来确实没有浏览计数代码了。

我以为是更新了 WP 导致 PostViews 插件不工作了,于是打开 WP-PostViews 源码看了下,发现有如下逻辑代码:

if($should_count) {			
	if(defined('WP_CACHE') && WP_CACHE) {
		echo "\n".'<!-- Start Of Script Generated By WP-PostViews -->'."\n";				
		echo '<script type="text/javascript">'."\n";
		echo '/* <![CDATA[ */'."\n";
		echo "jQuery.ajax({type:'GET',url:'".admin_url('admin-ajax.php')."',data:'postviews_id=".$id."&action=postviews',cache:false});";
		echo '/* ]]> */'."\n";
		echo '</script>'."\n";						
		echo '<!-- End Of Script Generated By WP-PostViews -->'."\n";
	} else {
		if(!update_post_meta($id, 'views', ($post_views+1))) {
			add_post_meta($id, 'views', 1, true);
		}
	}
}

发现了开启 ajax 计数的必要条件:开启 WP_CACHE 缓存!!!!!

鉴于对 WP 的熟悉程度,我直接打开了 wp-config.php 文件,发现果然是我自己注释了如下代码:

//define("WP_CACHE", true);

估计是之前调试网站的时候注释掉了。

于是取消注释,重载 php-fpm,并清理 Nginx 静态缓存后,前台熟悉的 ajax 代码就回来了:

<!-- Start Of Script Generated By WP-PostViews -->
<script type="text/javascript">
/* <![CDATA[ */
jQuery.ajax({
	type:'GET',
	url:'https://zhangge.net/wp-admin/admin-ajax.php',
	data:'postviews_id=5832&action=postviews',
	cache:false
});
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews -->

再看了下 Nginx 日志,admin-ajax.php?xxx 的请求也回来了,看来浏览计数功能已恢复正常。

三、结论分析

①、为什么并非完全不计数或只计数一次?

回溯了下过程,很明显的发现,文章发布后还是有计数的,只是计数非常少,这是为什么?实际上,原因非常简单,文章在首次缓存的时候,WP-PostViews 其实是会工作一次的,使用的是非缓存环境下的 php 计数。计数之后,文章就缓存下来了,再次访问就不会再更新计数了,直到有人发表了评论或者缓存到期,导致缓存被刷新,才会再一次发起浏览计数!这就是为啥并非不计数或只计数一次的原因了。

②、WP-PostViews 缓存环境下计数的条件

这个问题很常见,刚我还搜了下,发现也有不少和我这个类似的情况。也就说,PostViews 插件会去判断 WP 是否开启了缓存(WP_CACHE),若开启了则使用 ajax 的计数方式,否则使用 php 计数方式。

因此,如果你使用的是非 PHP 的缓存机制,比如 Nginx 的 fastcgi_cache 或者 proxy_cahe,那么必须在 wp-config.php 里面开启 WP_CACHE:

define("WP_CACHE", true);

让插件知道你的网站是有缓存机制的。要不然,你就得修改插件,去掉这个判断,让插件强行在页面中插入 ajax 计数代码了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

Shodan新手入坑指南

*本文原创作者:xiaix,本文属FreeBuf原创奖励计划,未经许可禁止转载 亲们~黑五 Shodan Membership 只要5刀,你剁手了没? 什么是 ...

57350
来自专栏北京马哥教育

Redis集群及管理讲解

一、为什么要弄redis集群 集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我...

43470
来自专栏blackheart的专栏

[认证授权] 5.OIDC(OpenId Connect)身份认证授权(扩展部分)

在上一篇[认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分)中解释了OIDC的核心部分的功能,即OIDC如何提供id token来...

32180
来自专栏张戈的专栏

解决Linux下MySQL启动错误Starting MySQL.Manager of pid-file quit without updating file.[FAILED]

上午刚装完 MySQL,启动时报如下错误: Starting MySQL.Manager of pid-file quit without updating f...

38050
来自专栏Java技术交流群809340374

主流RPC框架详解,以及与SOA、REST的区别

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术...

9.4K40
来自专栏wblearn

我的Github之Pull request的使用

GitHub已经成为的一切开放源码软件的基石。开发人员喜欢它,基于它进行协作,并不断通过它开发令人惊叹的项目。除了​​代码托管,GitHub的主要吸引力是使用它...

13020
来自专栏Vamei实验室

Linux文件管理

对于计算机来说,所谓的数据就是0和1的序列。这样的一个序列可以存储在内存中,但内存中的数据会随着关机而消失。为了将数据长久保存,我们把数据存储在光盘或者硬盘中。...

25880
来自专栏GreenLeaves

Oracle 数据库实例和数据库

本文参考自oracle数据库实例,数据库的理解,纯属读书笔记,用于加深记忆。 先看Tom关于这二者的解释: 1、数据库 物理操作系统文件或磁盘的集合(我觉得可以...

249100
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装Prometheus

Prometheus是一个功能强大的开源监控系统,可从您的服务中收集指标并将其存储在时间序列数据库中。它通过Grafana等工具提供多维数据模型,灵活的查询语言...

1.1K20
来自专栏磨磨谈

fio测试ceph的filestore

fio是一个适应性非常强的软件,基本上能够模拟所有的IO请求,是目前最全面的一款测试软件,之前在看德国电信的一篇分享的时候,里面就提到了,如果需要测试存储性能,...

40020

扫码关注云+社区

领取腾讯云代金券