解决网站静态缓存后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 计数代码了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法