WordPress高级开发,缓存机制
WordPress开发中,一定离不开和数据库打交道,不管是插件也好,还是主题也好,一定会用上数据库。插件还好说,但是主题,如果不优化好,会极大增加数据库查询的次数,数据库查询次数越多,对于网站来说,也就越慢了。
以主题开发来说,先要了解WordPress文章循环。
在首页,WordPress会出现文章列表循环,也就是说通过数据库,查询文章列表,放到一个变量里面。
至于查询多少篇文章,以设置里面的为准。
除了主查询,其他的查询,基本上和WordPress没有关系了。
很多主题,除了主查询,还有其他的查询,以果核主站为例,使用的是justnews主题,除了上面的文章列表,还有下面的文章模块,微信推文、圈内新闻、以及果核视频。
那么首页访问,光这三个模块,就会多出3次文章查询。经过果核排查,果核网站目前首页查询次数超过了300次,这个数字无异于是非常恐怖的。
与数据库打交道的地方
文章列表
评论区
文章阅读次数、收藏、点赞等
如何查看次数呢,可以用到WPOPT插件的开发与调试,开启以后,能在控制台查看到性能信息。
如何减少查询
对于查询数据库,减少查询,可以将文章转换成纯静态页面,常用的WordPress缓存插件包括WP Super Cache、W3 Total Cache和WP Fastest Cache等。这些插件可以自动化地管理WordPress缓存,从而提高网站的性能和速度。
但是,更多的,是需要主题开发者自己的素养,不能为了实现一些炫酷的功能,查询数据库而不缓存。
果核之前在开发CorePress Pro的时候,虽然没有乱查询,但是实现功能的时候,必须得和数据库打交道,避免不了查询。
但是随着技术的提高,与对WordPress程序的剖析,学会了更多高级的技术,用到了重构的主题上,将之前CorePress Pro主题的接近100次数据库查询,减少到了30次左右的必要查询,这些查询更多的是WordPress自身的查询。
如果有Redis,那么这个数字还能继续减少。最终首页查询次数,可以给查询为0。当然Redis的话,只能用一个网站,如果服务器上有多个Redis使用的话,可能造成数据混乱的情况。所以,我还是选择了第一种方案,使用WordPress自带缓存。
WordPress的transient
WordPress的transient是一种用于存储短期数据的API。它可以将数据存储在WordPress的数据库中,并设置一个过期时间。在过期时间到达后,数据将被自动删除。
transient API提供了三个函数来管理缓存数据:
set_transient($transient, $value, $expiration):将数据存储在数据库中,并设置过期时间。
get_transient($transient):从数据库中检索瞬时数据。
delete_transient($transient):从数据库中删除瞬时数据。
// 存储数据
$data = '这是要存储的数据';
set_transient( 'my_transient_data', $data, 3600 ); // 过期时间为1小时
// 检索数据
$data = get_transient( 'my_transient_data' );
if ( false === $data ) {
// 如果数据不存在或已过期
// 执行代码来生成数据
$data = '这是新生成的数据';
set_transient( 'my_transient_data', $data, 3600 ); // 存储新生成的数据
}
// 输出数据
echo $data;
将此方法,用到需要和数据库打交道的地方,首先先去获取一下有没有缓存数据,没有再进行查询。这样就不需要直接查询数据库了。
在CorePress Pro重构版主题里面,我将这个方法抽象出成了一个类公共方法,方便调用。
方法是先查询是否有缓存,没有的话,调用一个回调方法,这个回调,调用此函数的地方写入即可。
static function Cache($key, $call_back, $forced_update = false)
{
if ($forced_update === true) {
$data = call_user_func($call_back);
set_site_transient($key, $data, 3600);
} else {
$data = get_site_transient($key);
if ($data === false) {
$data = call_user_func($call_back);
set_site_transient($key, $data, 3600);
}
}
return $data;
}
例如,在文章首页,要调用查询文章列表的时候,直接这样赋值,就无需判断是否过期,非常简单方便。
$post_list = Theme::Cache('home_post_list_query_' . $paged, function () use ($paged) {
return WordPress::getPostList($paged);//查询文章的方法
});
后续如果要拓展更多的缓存功能,只需要修改Cache函数,而不影响其他写好的代码。
也希望更多的插件和主题能用上缓存机制,为WordPress减少负担。