WooCommerce商店页无main query导致product_tag筛选失效问题
问题根因
- 你的主查询判断逻辑存在错误:
woocommerce_product_query_tax_query钩子传入的$wc_query是当前正在执行的WooCommerce查询实例,你调用$wc_query->get_main_query()返回的是全局主查询对象,它本身永远是主查询,所以你的判断条件无法识别当前触发钩子的查询是否为主查询,导致逻辑混乱。 - 你在
render_category_tag_id_filters中调用wc_get_products获取全量商品ID时,这个自定义查询也会触发woocommerce_product_query_tax_query钩子,如果不加区分就会被你的筛选逻辑过滤,导致顶部标签列表仅返回筛选后商品对应的标签。 - 这不是WooCommerce的bug,属于判断逻辑的写法错误。
修复方案
步骤1:修正主查询判断逻辑
直接使用WordPress原生的is_main_query()判断当前执行的查询是否为主查询,同时补充页面类型判断,仅在商店页、商品分类页生效。
步骤2:给自定义查询加排除标记
给render_category_tag_id_filters中的wc_get_products查询增加自定义参数标记,筛选逻辑遇到该标记直接跳过,避免过滤全量商品ID的查询。
修改后的完整代码示例
筛选逻辑部分
public function apply_category_tag_id_filters( array $tax_query, \WC_Query $wc_query ): array { // 跳过带自定义排除标记的查询 if ( isset( $wc_query->query_vars['ignore_tag_filter'] ) && $wc_query->query_vars['ignore_tag_filter'] ) { return $tax_query; } // 仅在商店页/分类页的主查询生效 if( ! is_main_query() || ! ( is_shop() || is_product_category() ) ) { return $tax_query; } // Get the filter tag IDs $filter_tag_ids = $this->get_category_filter_tag_ids(); if ( ! is_array( $filter_tag_ids ) || 0 === count( $filter_tag_ids ) ) { return $tax_query; } $tax_query[] = array( 'taxonomy' => 'product_tag', 'field' => 'term_id', 'terms' => $filter_tag_ids, 'operator' => 'AND', ); return $tax_query; }
标签列表渲染部分
public function render_category_tag_id_filters(): void { // Get a list of all product IDs if ( is_shop() ) { $product_ids = wc_get_products( [ 'limit' => PHP_INT_MAX, 'return' => 'ids', 'ignore_tag_filter' => true, // 新增排除标记 ] ); // Get a list of product IDs in this category } else if ( is_product_category() ) { $product_cat = get_query_var( 'product_cat' ); $product_ids = wc_get_products( [ 'category' => $product_cat, 'limit' => PHP_INT_MAX, 'return' => 'ids', 'ignore_tag_filter' => true, // 新增排除标记 ] ); // Don't continue } else { return; } // Render template part here etc. etc. } add_action( 'woocommerce_before_shop_loop', [ $this, 'render_category_tag_id_filters' ] );
内容的提问来源于stack exchange,提问作者Michael Elementary
相关产品推荐
相关产品推荐

