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

WooCommerce自定义商品查询失效 无法按tax_query筛选商店页抽奖商品

问题根源

你的代码存在以下3个核心错误,导致查询不生效:

  • 传参逻辑错误:$q->set('tax_query') 仅接收分类查询规则,你把post_type、show_past_lottery、fields这些不属于分类查询的参数也全部塞入,不符合WordPress查询参数规范
  • 嵌套错误:在tax_query内部重复嵌套了tax_query字段,参数结构完全错误
  • 缺少生效范围限制:没有限制规则仅在Shop页面的主查询生效,会干扰后台、其他列表页的查询,也容易被其他优先级更高的查询逻辑覆盖

修复方案

提供两种经过验证的可行写法,二选一即可:

写法1:使用pre_get_posts钩子

add_action( 'pre_get_posts', 'show_active_lotteries_only' );
function show_active_lotteries_only( $q ){
    // 仅在前端Shop页面的主查询生效,避免干扰其他查询
    if ( ! is_admin() && is_shop() && $q->is_main_query() ) {
        // 单独设置各查询参数
        $q->set( 'post_type', 'product' );
        $q->set( 'show_past_lottery', false );
        $q->set( 'tax_query', array(
            array(
                'taxonomy' => 'product_type',
                'field'    => 'slug',
                'terms'    => 'lottery'
            )
        ) );
    }
}

写法2:使用woocommerce_product_query钩子(更适配WooCommerce场景)

这个钩子只会在WooCommerce商品查询时触发,不需要额外判断主查询属性:

add_action( 'woocommerce_product_query', 'show_active_lotteries_only' );
function show_active_lotteries_only( $q ){
    if ( is_shop() ) {
        $q->set( 'show_past_lottery', false );
        $q->set( 'tax_query', array(
            array(
                'taxonomy' => 'product_type',
                'field'    => 'slug',
                'terms'    => 'lottery'
            )
        ) );
    }
}

注意事项

  • 代码添加到当前主题的functions.php文件,或自定义功能插件中即可
  • 修改后先清空站点缓存、浏览器缓存,再刷新Shop页面验证效果
  • 如果你用的不是WooCommerce默认的Shop归档页,而是自定义页面做商品列表,需要把代码中的is_shop()替换为is_page('自定义页面的别名/ID')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:48:04