如果你的网站文章量非常大(如几十万至上百万),你可以按条件移除 GROUP BY wp_posts.ID,以减少查询时间和临时表创建压力。
下面是一个推荐的代码片段,适用于大数据环境,只在前台主查询中生效,并排除搜索页和 admin 区域:
高性能环境推荐代码(适合大数据站点使用)
add_filter('posts_groupby', function ($groupby, $query) {
// 仅作用于前台主查询,排除后台、搜索页、REST API等
if (!is_admin() && $query->is_main_query() && !is_search() && !defined('REST_REQUEST')) {
// 可按需限制到归档页、首页等(可选)
if (is_home() || is_category() || is_tag() || is_tax() || is_date()) {
if (strpos($groupby, 'wp_posts.ID') !== false) {
return '';
}
}
}
return $groupby;
}, 10, 2);
条件 意义
!is_admin() 避免影响后台
$query->is_main_query() 确保是主循环(防止影响小工具、二次查询)
!is_search() 搜索页更容易出现重复文章,最好保留 GROUP BY
!defined(‘REST_REQUEST’) 防止影响 WordPress REST API 查询
strpos($groupby, ‘wp_posts.ID’) !== false 只有确实存在才移除,防止误操作