前言

纠结了很久,我最终还是用上了全站静态化。

我为什么不要静态化呢:

  1. 首页的随机背景图会被缓存;
  2. 缓存后,php计数会失效。

我为什么要静态化呢:

  1. 为了速度;
  2. 为了减少服务器消耗。

不得不说,静态化后的速度提升真的不是一星半点。用Chrome看,本站的TTFB在动态化的时候有整整1s,用了redis缓存之后还是有300~500ms,但是上了Cloudflare的全站静态缓存之后,竟然降到了100ms以下,提升速度真是立竿见影呀。

我权衡了一下,背景图其实影响不大,但是计数失效确实是比较伤的,还好网络上已经有牛人给了解决方法。

原帖链接:

WordPress配置WP Super Cache缓存导致不计数的问题

正文

大概的原理(我猜的)是,你可以在主题编辑器中的function.php里面把记录阅读数的方法绑定到ajaxAction上,每次文章被打开时,浏览器都会自动向WordPress的ajax接口发送post请求,服务器就会增加一个阅读计数。

但是这个计数不会立即体现出来,会在下一次刷新缓存的时候更新。

具体步骤和原文类似

1 查看自己原本的计数方法

打开主题编辑器,打开function.php,找到类似下面的代码:

function set_post_views() {
    global $post;
    $post_id = intval($post->ID);
    $count_key = 'views';
    $views = get_post_custom($post_id);
    $views = intval($views['views'][0]);
    if(is_single() || is_page()) {
        if(!update_post_meta($post_id, 'views', ($views + 1))) {
            add_post_meta($post_id, 'views', 1, true);
        }
    }
}
add_action('get_header', 'set_post_views');

看样子是把阅读数记录到了postmeta数据表中的views字段,和原文中的方法一样,那我就直接用原文的好了。

2 修改计数方法,绑定AjaxAction

把上面的代码全部注释掉,换成下面的代码,顺便绑定ajaxAction:

function set_post_views() {
		 $post_ID = $_POST["id"];//找到文章
		 if ($post_ID) {
			 $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);
		 }
 	}
 die;//结束
}
add_action('wp_ajax_nopriv_single_view', 'set_post_views');
add_action('wp_ajax_single_view', 'set_post_views');

其中wp_ajax_nopriv_your_action是用来获取匿名用户的请求的,而wp_ajax_your_action是用来获取登录用户的请求的,第二个参数set_post_views则是你要绑定的方法的名称。

3 引入js代码

在主题编辑器的文章页添加代码

<script type="text/javascript">
   function set_views() {
   $.post(
   '你的域名/wp-admin/admin-ajax.php', 
   {action:'single_view', id:<?php the_ID(); ?>},
   null
   );
  }
	window.onload = set_views;
</script>

其实原文那种是最简洁的写法,但我的浏览器不知为什么执行不起来,就魔改了一下下。

4 测试一下

测试的方法很简单

  1. 先不缓存,刷新几次看看会不会涨阅读数;
  2. 缓存,刷新一下,用浏览器开发工具看看network中有没有发送计数请求;
  3. 缓存,多找几个不同的浏览器刷新几次,再清除缓存,看看有没有更新阅读数