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
相关产品推荐
相关产品推荐

