You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改pre_get_posts查询后修正found_posts数值 - WordPress技术求助

解决WooCommerce分类/搜索页隐藏指定分类缺货商品后的计数错误问题

我明白你遇到的问题了——你的代码已经成功隐藏了目标缺货商品,但页面上的商品总数计数还是显示原始的未过滤数量,这是因为WooCommerce的found_posts(用于显示商品总数的核心参数)没有同步更新为过滤后的结果。下面是修正后的完整代码,同时我会拆解关键修改点:

function hide_out_of_stock_parts_from_cat( $q ) { 
    if ( ! $q->is_main_query() || is_admin() ) { 
        return; 
    } 

    // 仅在目标分类页或搜索页执行过滤逻辑
    if ( is_product_category(1111) || is_search() ){ 
        if ( $outofstock_term = get_term_by( 'name', 'outofstock', 'product_visibility' ) ) { 
            $tax_query = (array) $q->get('tax_query'); 

            // 明确逻辑关系:保留「不属于my-category-slug分类」或「不缺货」的商品
            $tax_query[] = array(
                'relation' => 'OR',
                array( 
                    'taxonomy' => 'product_visibility', 
                    'field' => 'term_taxonomy_id', 
                    'terms' => array( $outofstock_term->term_taxonomy_id ), 
                    'operator' => 'NOT IN' 
                ), 
                array( 
                    'taxonomy' => 'product_cat', 
                    'field' => 'slug', 
                    'terms' => array( 'my-category-slug' ), 
                    'operator' => 'NOT IN' 
                ), 
            ); 

            $q->set( 'tax_query', $tax_query ); 

            // 绑定过滤器,同步调整商品计数
            add_filter( 'found_posts', 'adjust_found_posts_for_hidden_products', 10, 2 );
        } 
        remove_action( 'pre_get_posts', 'hide_out_of_stock_parts_from_cat' ); 
    } 
} 
add_action( 'pre_get_posts', 'hide_out_of_stock_parts_from_cat' );

// 调整found_posts为过滤后的实际商品数量
function adjust_found_posts_for_hidden_products( $found_posts, $q ) {
    // 仅针对目标页面的主查询生效
    if ( $q->is_main_query() && ( is_product_category(1111) || is_search() ) ) {
        // 基于修改后的查询参数重新获取实际匹配数量
        $temp_query = new WP_Query( $q->query_vars );
        $found_posts = $temp_query->found_posts;
        wp_reset_postdata();

        // 移除过滤器,避免干扰其他页面的查询计数
        remove_filter( 'found_posts', 'adjust_found_posts_for_hidden_products', 10 );
    }
    return $found_posts;
}

核心修改说明:

  • 明确Tax Query逻辑:给嵌套的分类查询添加了'relation' => 'OR',精准定义了过滤规则——只隐藏同时满足「属于my-category-slug分类」和「缺货」的商品,避免误过滤其他商品。
  • 同步更新计数:新增found_posts过滤器函数,基于修改后的查询参数重新执行查询,获取实际可见的商品数量,替换掉原始的未过滤计数,让页面显示的总数和实际展示的商品数一致。
  • 避免全局影响:在过滤器执行后立即移除自身,确保这个计数调整只作用于目标分类页和搜索页,不会干扰网站其他页面的商品计数逻辑。

你可以直接替换原有代码,测试后分类页和搜索页的商品计数就会正确显示实际可见的商品数量了。

内容的提问来源于stack exchange,提问作者Seb G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:14:41