在 WordPress 中设置 no_found_rows 禁止使用 SQL_CALC_FOUND_ROWS 计算总数,以优化文章列表页打开速度
WordPress分页优化:禁止SQL_CALC_FOUND_ROWS查询和使用COUNT(*)代替
我是一名WordPress博主,最近在对博客进行优化,发现分页查询速度较慢,经过研究得出了以下两种优化方案,希望对于遇到相同问题的朋友有所帮助。
禁止使用SQL_CALC_FOUND_ROWS查询
SQL_CALC_FOUND_ROWS MySQL查询在WordPress中用于获取查询结果总数量,这个查询的速度非常慢,加上WordPress不能缓存这个查询结果,当文章数量比较多的时候,WordPress的列表页打开速度会受到影响。
为了实现分页功能,WordPress在很多查询中都使用了SQL_CALC_FOUND_ROWSMySQL查询,即使我们根本不需要分页功能,SQL_CALC_FOUND_ROWS的功能是让MySQL计算在数据库中总共有多少条记录匹配查询的条件,如果匹配的记录非常多,这将是非常耗费时间的一件事情。
通过查看WordPress3.x的源码,我发现了一个没有写在参考文档里面参数:no_found_rows,这个参数接受的值为布尔值,它可以告诉query_posts和WP_Query不要计算总匹配数量,我们可以这样使用:
query_posts('no_found_rows=true&cat=1&numberposts=1');
这样,WordPress再查询文章的时候,就不会再进行不必要的总匹配记录数计算了,对提高WordPress页面速度和节能环保有帮助。
使用COUNT(*)代替SQL_CALC_FOUND_ROWS查询实现分页功能
除了SQL_CALC_FOUND_ROWS查询,在MySQL中我们还可以使用COUNT(*)来获取总行数,经过对比,我们发现后者的速度比前者要快不少(有时候会快到10倍之多),我们可以使用COUNT(*)来代替SQL_CALC_FOUND_ROWS查询来获取总行数,这样既可以加快查询速度,又不会损失分页功能。
首先,我们使用pre_get_postsFilter钩子,直接在所有查询中设置no_found_rows禁用SQL_CALC_FOUND_ROWS查询。
add_filter('pre_get_posts',function(\WP_Query$wp_query)
{
$wp_query->set('no_found_rows',true);
});
添加了以上代码,所有WordPress查询中的分页参数便缺失了,分页功能自然就失效了。我们需要使用posts_clauses钩子修改WordPress数据库查询,使用COUNT(*)查询来获取总行数,并设置分页所需要的参数。
add_filter('posts_clauses',function($clauses,\WP_Query$wp_query)
{
//跳过单页面
if($wp_query->is_singular()){
return$clauses;
}
global$wpdb;
//查询是否设置了一下变量
$where=isset($clauses['where'])?$clauses['where']:'';
$join=isset($clauses['join'])?$clauses['join']:'';
$distinct=isset($clauses['distinct'])?$clauses['distinct']:'';
//构造并运行查询,将查询结果设置为我们要运行主查询的“found_posts”参数。
$wp_query->found_posts=$wpdb->get_var("SELECT$distinctCOUNT(*)FROM{$wpdb->posts}$joinWHERE1=1$where");
//计算每页应该有多少文章。
$posts_per_page=(!empty($wp_query->query_vars['posts_per_page'])?absint($wp_query->query_vars['posts_per_page']):absint(get_option('posts_per_page')));
//设置max_num_pages参数
$wp_query->max_num_pages=ceil($wp_query->found_posts/$posts_per_page);
//返回$clauses自查询,以便运行主查询
return$clauses;
},10,2);
添加了以上代码之后,我们便把使用COUNT(*)查询替换SQL_CALC_FOUND_ROWS查询,如果您的WordPress文章总数比较多(千条以上),查询加速会比较明显。当然,如果平时使用的时候,并没有感觉到分页的打开速度慢,就不要多此一举添加上面的代码了,毕竟多一事不如少一事,如果没有问题,就不要进行优化。
-
如何创建WordPress古腾堡编辑器的区块(PHP+原生JS) 2024-01-10 01:01:06
-
搭建一个WordPress网站需要多少成本 2023-11-06 00:09:51
-
Symlink介绍(附:如何使用Symlink进行WordPress开发) 2023-11-05 23:38:32
-
让WordPress实现数据库同步的插件:HyperDB 2023-10-24 23:40:49
-
allegro电商平台值得做吗(附:2023年Allegro注册流程指南) 2023-10-08 21:53:39
-
印度跨境电商平台有哪些(附:印度跨境电商做什么产品好) 2023-10-08 21:34:23
-
跨境电商必看的几大海外二手电商平台 2023-10-08 18:04:42
-
WordPress同城互联网产品解决方案:UBASE 2023-10-03 16:40:39
-
WordPress网站的安全插件:wordfence 2023-09-14 09:25:18
-
WordPress 6.3 支持在手动更新插件和主题失败后回滚旧版本 2023-08-28 16:58:45