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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:39:03