自由屋推书网—热门的小说推荐平台!

你的位置: 首页 > wordpress分享

wordpress开启静态缓存后,WP-PostViews插件不计数怎么办

2017-07-16 13:29:14

有些朋友wordpress开启了静态缓存后,WP-PostViews插件不计数或计数不准确怎么办?今天偶然在张戈博客看到这篇文章,转载一下分享一下!

发现WP-PostViews插件不计数问题后,花时间分析了下,结果一查网站日志,发现浏览计数的请求居然一个都没有,由于网站开启了纯静态缓存(nginx_fastcgi_cache),所以wp-postviews的计数方式会自动改为ajax提交方式,正常情况下,Nginx日志里面会出现如下请求记录:

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

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

WP-PostViews插件不计数问题解决问题

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

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

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

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

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

  1. //define("WP_CACHE", true);

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

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

JavaScript

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

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

WP-PostViews插件不计数问题结论分析

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

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

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

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

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

  1. define("WP_CACHE", true);

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

本文转载,原文链接张戈博客:https://zhangge.net/5123.html

编辑推荐

热门小说