首页 / 技术 / 正文

利用admin-ajax.php解决WordPress中缓存插件与页面计数器冲突问题

2017年08月13日 6 条评论 ... 技术 /

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

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

什么是 admin-ajax.php 文件

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

admin-ajax.php基本用法

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

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

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

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

首先对前台发送 ajax 的代码进行编写,查询条件只有文章ID,所以在 data 部分只有 action 和 post_id 两个参数,在 single.php 单页模板中增加如下代码:

要注意的是,这段PHP代码在实际翻译成HTML代码的时候,都将是固定不变的,达到了缓存页面固定不变的要求。

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

  1. <span id="pagenum">...</span><span><i class="fa fa-folder-o"></i> 

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

  1. //2017年8月11日增加访问计数ajax  
  2. function visitors(){  
  3.     $post_ID = $_POST['post_id'];  
  4.     if($post_ID) {  
  5.         $post_views = (int)get_post_meta($post_ID, 'views', true);  
  6.         if(!update_post_meta($post_ID, 'views', ($post_views+1))) {  
  7.             add_post_meta($post_ID, 'views', 1, true);  
  8.         }  
  9.         echo json_encode($post_views+1);  
  10.     }  
  11.     die();  
  12. }  
  13. add_action( 'wp_ajax_visitors', 'visitors' );  
  14. add_action( 'wp_ajax_nopriv_visitors', 'visitors' ); 

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

如此,前后端代码都搞定,异步读取阅读数量的效果也就实现了,经过测试,开启了 WP Super Cache 插件后,页面计数完美显示,以为美中不足的是,显示还是有一定的延迟,这没办法,因为本来就是异步通信。

6 条评论

Loading...
  1. 变态鹅

    是本鹅错觉嘛,以前没有那个文章打赏按钮,刚刚加的?!(滑稽

    2017-08-15 [回复]
    • 有野出没

      这几天捣鼓了一下,加了点新东西

      2017-08-15 [回复]
  2. 姜辰

    专业的WP用户!

    2017-08-15 [回复]
  3. 野兔

    学习了!

    2017-09-25 [回复]
  4. 野兔

    哥,更新首页列表中文章的浏览计数是不是同理?

    2018-02-25 [回复]
    • 有野出没

      首页因为需要显示的文章浏览计数太多,所以就没有做,其实也是可以实现的

      2018-02-26 [回复]

发布评论