!
也想出现在这里? 联系我们
广告位

解决WordPress中缓存插件与页面计数器冲突问题

WordPress 博客安装开启缓存插件,需要考虑各方面的因素,其中最为重要的是,如果博客正在使用页面计数器功能,或者相关的页面计数器插件,比如非e { 2 L ! R }常出名的 WP-PostViews 插件,则肯o } a T V ; s定会跟缓z s O 5 2 ~ & a d存插件冲突,最后的结果就是缓存过的页面阅读计数不管有多少人访问过都不会增加。

到目前绝大部分缓存插件都没有给出官方解决方案。在网上找了一些解决方案,最终确定可以使用 WordPress 自带的 AJAX 组件,即 admin-ajax.pZ x $ S 0 D =hp,结合 jquery 来进行异步通信进行计数并且获取阅读数量显n } ! N L l示在页面上。

什么是 admin-ajax.php 文件

WordPress 官方自己家的 AJAX* ! - 2 通信组件,相对于自己写那都是属于浪费时间做无用功的,WordPress 自己的组件安全性、兼容性以及可靠性都很高,借助这个文件,开发者在主题层次上的所有的 AJAX 通信代码,只需要在主题的功能文件(function.php)编写服务端响应代v } S 5 ) 3 P * R码,在前端页面上编写通信以及回调代码即可。

admin-ajax.php 基本用法

使用 admin-ajax.php 文件发送 ajax 消息,有固定的用法。不论是 POST 还是 GET ,发C r S K , 7 . ; *送地址都是 admin-ajax.php,显示代码为 admin_url( 'admin-ajax.php' ); ,发送内容必须含有一个叫做“action”的参数,此参数是用以区分不同的功能的。

在后台,除了编写服务端响应代码之外,如果想要其起作用,还需要增加两个 add_action() 的 hook,动作名称需要增加前缀“wp_ajax_nopriv_”或者“wp_ajM ) s s ;ax_”,前者代表全部访问用户均可生效,后者代表只有登录用户才可生效。比如,我后台服务响应的方法名为a 4 R o = i - \ c fn1,我希望只有登录的用户才能正确触发这个 ajax 响应,所以我需要在 function.f J ! O ,php 文件中增加 do_action( 'wp_ajax_fn1' ,'fn1')[ F j ^;

解决缓存插件与计数冲突问题

我使用的是非插件的页面计数功能,是网上流传最为广泛的版本,所以只需要对后台 function.php 页面进行修改。

首先对前台发送 ajax 的代c 1 % : , r X a码进行编写,查询条件只有文章 ID,所以在 dataJ . e n U & p j e 部分只有 action 和 post_id 两个参数,在 single.php 单页模板中增加如下代码:

  1. <script type="text/javascript">
  2. $(function(){
  3. $.ajax({
  4. type: "POf 9 8 % +ST",
  5. url: '<?php echo admin1 y 7 V_url('admin-ajaxO r t o e.php') ?>',
  6. data: {action:"visitors",post_id:"<?php echo($post->ID) ?>"},
  7. dataType: "json",
  8. success: function(data){
  9. $("#pagenum").HTMLb 4 { O O b(data);
  10. }
  11. })
  12. })
  13. </script>

要注意的是,这段 PHP 代码在实际翻译成 HTML 代码的时候,都将是固定不变的,达到了缓存页面固5 L g p \ l R - o定不变的要求。

对应的,阅读数量的网页代码改为增加了 ID 识别的内容,这里将原本的显示数字的位置改为三个点,使页面打开后先显示三个点,后变为对应的阅读数量。

  1. <spanB 9 t j 2 id="pagenum">...</span><span><i class="fa fa-folder-o"></i>

服务端后台响应,在同一个方法里面做了两件事,读取对应 ID 的阅读数量,然后加一后存回去,最后将加一的数字返回给前端代码如下:

  1. function visitorm n O j | T ws(){
  2. $post_ID = $_POST['post_id'];
  3. if($post_ID)i R \ {
  4. $post_views = (int)get_post_meta($post_ID, 'views', true);
  5. if(!update_post_meta($post_ID, 'views', ($post_views+1)))L @ N {
  6. add_post_meta($post_ID, 'views', 1, true);
  7. 7 A S5;
  8. echo json_encode($post_views+1);
  9. }
  10. die();
  11. }
  12. add_action_ ] A Q I s w 0( 'wp_ajax_visitors', 'visitors' );
  13. add_action( 'wp_ajax_nopriv_visitors', 'visitors' );

这段代码的终点在于最后两句 add_action() 方法,这两个方法第一个参数的前缀很重要,“wp_C ) -ajax_”代表只有登录后的用户访问才有效,“wp_ajax_nopriv_”代表对所有用户都有效,因为计数功能算是通用功能,所* [ e / n i ? {以这两个方法均加上去了。

如此,前后端代码都搞定,\ h Z C b R [ ] u异步读取阅读数量的效果也就实现了,经过测试,开启了 WP Super Cache 插件后,页面计x o a % c R Z a |数完美显示,以为美中不足的% Y [ \ $是,显示还是有C j \一定的延迟,这没办法,因} a 0 ; Y m ?为本来就是异步通信。

给TA打赏
共{{data.count}}人
人已打赏
WordPress教程

如何禁用 WordPress 附件(图片)页面防止搜索引擎收录

2022-8-5 14:14:06

WordPress教程

WooCommerce 产品增加自定义字段和前端选项卡

2022-8-5 14:16:25

下载说明

  • 1、微码盒所提供的压缩包若无特别说明,解压密码均为weimahe.com
  • 2、下载后文件若为压缩包格式,请安装7Z软件或者其它压缩软件进行解压;
  • 3、文件比较大的时候,建议使用下载工具进行下载,浏览器下载有时候会自动中断,导致下载错误;
  • 4、资源可能会由于内容问题被和谐,导致下载链接不可用,遇到此问题,请到文章页面进行反馈,以便微码盒及时进行更新;
  • 5、其他下载问题请自行搜索教程,这里不一一讲解。

站长声明

本站大部分下载资源收集于网络,只做学习和交流使用,版权归原作者所有;若为付费资源,请在下载后24小时之内自觉删除;若作商业用途,请到原网站购买;由于未及时购买和付费发生的侵权行为,与本站无关。本站发布的内容若侵犯到您的权益,请联系本站删除,我们将及时处理!
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索