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

Woocommerce模板index.php中category__not_in参数失效求助

解决WooCommerce首页排除特定产品分类的问题

嘿,我看到你的问题了——刚接触PHP和WooCommerce的话,很容易踩这个分类法的坑!你用category__not_in参数无效的核心原因是:WooCommerce的产品分类是自定义分类法product_cat,而category__not_in是专门针对WordPress默认文章分类(category)的参数,对产品分类完全不起作用。

解决方案:改用tax_query过滤产品分类

把你代码里的category__not_in替换为tax_query,专门针对product_cat分类法设置排除规则。同时我还发现你代码里的分页部分有个小问题(用了全局$wp_query但实际是自定义查询),一起帮你修正了:

修改后的完整代码:

<section id="content"> 
    <div class="container woocommerce"> 
        <?php 
        remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 ); 
        global $woocommerce_loop, $woocommerce; 
        $meta_query = $woocommerce->query->get_meta_query(); 
        $args = array( 
            'post_type' => 'product', 
            'post_status' => 'publish', 
            // 替换category__not_in为tax_query
            'tax_query' => array(
                array(
                    'taxonomy' => 'product_cat',
                    'field'    => 'term_id',
                    'terms'    => array(28),
                    'operator' => 'NOT IN',
                ),
            ),
            'ignore_sticky_posts' => 1, 
            'post__not_in' => $slider_arr, 
            'posts_per_page' => 9, 
            'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1), 
        ); 
        $products = new WP_Query( $args ); 
        if ( $products->have_posts() ) : 
            $x = 0; 
        ?> 
        <div id="posts_cont"> 
            <?php while ( $products->have_posts() ) : $products->the_post(); ?> 
                <?php woocommerce_get_template_part( 'content', 'product-home' ); ?> 
                <?php if ($x == 2) { echo '<div class="home_small_box clear"></div>'; $x = -1; } ?> 
            <?php $x++; endwhile; ?> 
        </div><!--//posts_cont--> 
        <div class="load_more_cont"> 
            <div align="center"><div class="load_more_text"> 
                <?php 
                ob_start(); 
                next_posts_link('LOAD MORE PRODUCT', $products->max_num_pages); // 这里传入自定义查询的max_num_pages
                $buffer = ob_get_contents(); 
                ob_end_clean(); 
                if(!empty($buffer)) echo $buffer; 
                ?> 
            </div></div> 
        </div><!--//load_more_cont--> 
        <?php 
        // 用自定义查询的max_num_pages,而不是全局$wp_query
        $max_pages = $products->max_num_pages; 
        ?> 
        <div id="max_pages_id" style="display: none;"><?php echo $max_pages; ?></div> 
        <?php endif; wp_reset_postdata(); ?> 
        <div class="clear"></div> 
    </div><!--//container-->

关键修改点说明:

  1. 替换参数:删除'category__not_in' => array( 28 ),添加tax_query数组,指定分类法为product_cat,排除ID28的分类。
  2. 分页修正:next_posts_link第二个参数要传入自定义查询$products->max_num_pages,同时$max_pages也要用$products->max_num_pages,不然加载更多会和全局查询混淆,导致分页错误。

为什么原来的参数无效?

WordPress里的分类分为两种:

  • 默认文章分类:分类法名称是category,对应参数category__not_in、category__in等。
  • 自定义分类法:WooCommerce的产品分类是product_cat,必须用tax_query来进行过滤,这是新手最容易混淆的点之一。

这样修改后,就能正确排除ID为28的产品分类了,分页功能也能正常工作~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:46:57