NIUBI
wordpress教程

WordPress 缓存导致文章阅读数点赞数不更新的解决办法

9个月前/ 77/ / WP爱好者/ 已收录/
导语: WordPress 缓存导致文章阅读数点赞数不更新这个问题应该很多 WordPress 站长遇到过,因为 WordPress 提速最简单的就是缓存,这种方案也收到广大个人站长的一致追捧,然而一缓存网页就成静态了,不会有 PHP 交互也就不会更新数据,难道缓存和阅读计数不能同时拥有吗?当然有而且还不止一种,天无绝人之路嘛,下面就是一种解决整个页面被缓存而导致文章阅读数点赞数不更新的解决办法。

WordPress 缓存导致文章阅读数点赞数不更新这个问题应该很多 WordPress 站长遇到过,因为 WordPress 提速最简单的就是缓存,这种方案也收到广大个人站长的一致追捧,然而一缓存网页就成静态了,不会有 PHP 交互也就不会更新数据,难道缓存和阅读计数不能同时拥有吗?当然有而且还不止一种,天无绝人之路嘛,下面就是一种解决整个页面被缓存而导致文章阅读数点赞数不更新的解决办法。

先声明下,由于原理一样,我这里就用阅读数做例子,点赞数就不讲了。并且这个办法不适用于内存缓存,因为内存缓存失效时还是会执行 PHP 代码计数的,使用这个方法的话会导致阅读数不够准确。如果是内存缓存用户,建议使用水煮鱼的方案,将阅读数存到内存中,等数量到了指定界限时,一次性写入阅读数,不过这样会出现阅读数无法及时更新的尴尬情况。

 

WordPress 缓存导致文章阅读数点赞数不更新的解决办法

解决办法:使用 ajax 获取文章阅读数量并刷新网页中阅读数量的 HTML 标签,服务器收到请求后,同时将原来的阅读数量加 1 并更新到数据库中。说到这里最关键的内容就是 ajax 提交请求了,既然是请求那就需要接口了,不然不知道请求谁呀,下面是一个简单的请求接口,大家参考下。

PHP 接口文件

将下面的代码复制保存为 views.php 文件,并放在主题目录下的 action 目录中,没有就新建一个 action 文件夹。

require( dirname(__FILE__).'/../../../../wp-load.php' ); nocache_headers(); $post_ID = isset($_POST['post_ID']) ? (int) $_POST['post_ID'] : 0; if ($post_ID!=0 ) {  $post_views = (int) get_post_meta($post_ID, 'views', true);   if (!update_post_meta($post_ID, 'views', ($post_views + 1))) {    add_post_meta($post_ID, 'views', 1, true);   }  $post_views = (int) get_post_meta($post_ID, 'views', true);         print_r(json_encode(array('error' => 0, 'views' => 1, 'response' => $post_views)));         exit; }else{  print_r(json_encode(array('error' => 1, 'views' => 0, 'response' => $post_views)));         exit; }

上面第一行代码是引入 WordPress 函数核心支持,没有这个文件我们就不能使用 WordPress 提供的函数。接着输出响应头部无缓存,然后判断 post 参数 post_id 这个是用来区分是哪篇文章的,没接收到就赋值 0,后面就是一些逻辑操作和存储自定义字段内容的函数,就不多做解释了,最后以 json 数据的形式输出提交的详情和阅读数量。

注意:add_post_meta 函数存储的自定义字段根据你自己的阅读数量字段修改,我使用的是大前端 dux 的文章阅读数量字段。

jQuery 请求数据

把上面的文件存储到服务器中,我们就可以使用下面的代码来执行 js 操作请求数据,在这之前先说一下,jQuery 必须在下面 js 之前引用,并且下面 js 在加载前 HTML 必须先加载,否则无效。

//获取阅读数 function getpostviews(postid){    $.ajax({                     type: "POST",                     url: 'https://www.xxx.com/wp-content/themes/dux/action/views.php',                     dataType: "json",                     data: {"post_ID": postid},                     success: function(data, textStatus, xhr) {                     if (data.error){ return false;}else{    $(".postviews").text("阅读("+data.response+")");   }                 }                 }); }

上面的 postviews 是我的文章阅读数量 HTML 标签的 class 名称,根据自己的主题修改,然后在主题的文章页模板 single.php 中写输出 js 代码:

<?php <script type="text/javascript"> $(document).ready(function (){  echo 'getpostviews('.get_the_ID().');'; }); </script> ?>

当然,除了文章页,页脚也可以输出,不过为了避免在页面中加载这个函数,所以我们可以使用 is_single 函数判断下是不是文章页,代码简单这里就不说了。具体效果见本站,这种方法适用于被腾讯 CDN 或者其它 CDN 缓存了整个页面的情况,也适用于被 WordPress 插件 wp_super_cache 缓存了整个页面的情况,这里就不一一举例了,试试看就知道效果。唯一的缺点就是有些浏览器如果禁止执行 js,那么我们的阅读数就失效了,还有就是 js 执行 post 操作需要时间,如果用户打开一瞬间就关闭网页,那么阅读数量也是无法更新的。

点点赞赏,手留余香

还没有人赞赏,快来当第一个赞赏的人吧!
admin给Admin打赏
×
予人玫瑰,手有余香
  • 2
  • 5
  • 10
  • 20
  • 50
2
支付
收藏 0 海报

版权归属:本文为原创文章,版权归 所有

本文链接:( 欢迎分享本文,转载请保留出处 )

免责声明:如发现本站有涉嫌抄袭侵权/违法违规的内容,请邮件/留言反馈,一经查实本站将立刻删除!

<< 上一篇

2020-05-29

下一篇 >>

2020-05-29

全部评论( 1 条 )
    最新评论
  1. ykkcom
    ykkcom 广东省广州市 电信

    看看怎么样

    沙发 2020-05-31 13:53
扫一扫二维码分享