前言
纠结了很久,我最终还是用上了全站静态化。
我为什么不要静态化呢:
- 首页的随机背景图会被缓存;
- 缓存后,php计数会失效。
我为什么要静态化呢:
- 为了速度;
- 为了减少服务器消耗。
不得不说,静态化后的速度提升真的不是一星半点。用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 测试一下
测试的方法很简单
- 先不缓存,刷新几次看看会不会涨阅读数;
- 缓存,刷新一下,用浏览器开发工具看看network中有没有发送计数请求;
- 缓存,多找几个不同的浏览器刷新几次,再清除缓存,看看有没有更新阅读数



Comments | NOTHING