在 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文章总数比较多(千条以上),查询加速会比较明显。当然,如果平时使用的时候,并没有感觉到分页的打开速度慢,就不要多此一举添加上面的代码了,毕竟多一事不如少一事,如果没有问题,就不要进行优化。

-
盘点2023年依然好用的4款WordPress轻社区主题 2023-05-29 08:00:54
-
盘点2023年最好用的三款wordpress知识库主题 2023-05-29 08:00:26
-
个人网站选择WordPress还是Typecho? 2023-05-28 23:33:13
-
wordpress建外贸B2C独立站的五大优势 2023-05-28 23:05:49
-
盘点2023年依然好用的3款wordpress文档主题 2023-05-28 23:02:19
-
盘点2023年依然好用的3款wordpress外贸网站主题 2023-05-28 22:59:41
-
盘点2023年依然好用的3款wordpress电商主题 2023-05-28 22:56:05
-
wordpress后台地址是多少(附:后台地址修改教程) 2023-05-28 22:54:15
-
盘点2023年依然好用的3款wordpress笔记主题 2023-05-28 22:51:13
-
开源wordpress主题:kratos 介绍 2023-05-28 22:47:46