WordPress 中使用 COUNT(*) 代替 SQL_CALC_FOUND_ROWS 查询实现分页功能

发布于 2021-05-31 12:57:55 字数 1950 浏览 1048 评论 0

Wordpress 的列表使用了 SQL_CALC_FOUND_ROWS 查询,用于缓存查询结果,方便下次查询记录条数时使用,除了 SQL_CALC_FOUND_ROWS 查询,在 MySQL 中我们还可以使用 COUNT(*) 来获取总行数,经过对比,我们发现后者的速度比前者要快不少(有时候会快到 10 倍之多),我们可以使用 COUNT(*) 来代替 SQL_CALC_FOUND_ROWS 查询来获取总行数,这样既可以加快查询速度,又不会损失分页功能。

首先,我们使用 pre_get_posts Filter 钩子,直接在所有查询中设置 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 $distinct COUNT(*) FROM {$wpdb->posts} $join WHERE 1=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 数据量大列表查询慢 sql_calc_found_rows 惹的祸

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

1CH1MKgiKxn9p

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

JackDx

文章 0 评论 0

信远

文章 0 评论 0

yaoduoduo1995

文章 0 评论 0

霞映澄塘

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文