首页 > 解决方案 > Wordpress 搜索优化:限制搜索结果(不是 post_per_page)

问题描述

我已经搜索了stackoverflow。它们都不适用于我的问题。大多数答案只是关于每页的限制(每页显示多少帖子,而不是搜索多少结果)

我正在尝试加快 wordpress 搜索速度。

例如,我有 1000 万条帖子要搜索。和用户类型“a”。搜索所有这些需要很长时间,因为 wordpress 使用的是 SQL_CALC_FOUND_ROWS。

事实是,无需搜索数百万行(帖子),答案“1000+”对用户来说就足够了。所以我们需要在找到 1000 个结果后停止搜索。

我能想到的唯一方法是使用:

'no_found_rows' => true

但是我们没有分页功能。

或者,也许我们可以使用单独的查询来获取结果并计算找到的帖子数量(使用限制器)?

我不明白 wordpress 怎么没有这个功能。甚至像亚马逊这样的大网站也会限制搜索结果。因此,如果您搜索“a”或“usb”,它将只返回前 20 页。

标签: wordpress

解决方案


试试这个代码,它在我的 wordpress 上工作,有 100 万个帖子

如果您使用搜索自定义帖子类型,请更改

post_type = '发布'

到您的帖子类型名称

add_filter('pre_get_posts', 'fix_search_pagination_with_nfr', 1000);

function fix_search_pagination_with_nfr() {
    global $wp_query, $wpdb;
    
    if ( ! is_admin() && $wp_query->is_main_query() && $wp_query->is_search() ) {
    
    $wp_query->query_vars['no_found_rows'] = 1;
    
    $wp_query->found_posts = $wpdb->get_var( "SELECT COUNT(*) FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')" );
    $wp_query->found_posts = apply_filters_ref_array( 'found_posts', array( $wp_query->found_posts, &$wp_query ) );
    
    
    if($wp_query->query_vars['posts_per_page'] > 0) {        
        $wp_query->max_num_pages = ceil($wp_query->found_posts / $wp_query->query_vars['posts_per_page']);
    } else {
        $wp_query->max_num_pages = 0;
    }
    
    
    }
    
    return $wp_query;
}

推荐阅读