前言
纠结了很久,我最终还是用上了全站静态化。
我为什么不要静态化呢:
- 首页的随机背景图会被缓存;
- 缓存后,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