在 WordPress 中设置 no_found_rows 禁止使用 SQL_CALC_FOUND_ROWS 计算总数,以优化文章列表页打开速度

文 / @WordPress主题

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

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。