WPBakery WooCommerce产品循环短码修改:隐藏缺货产品失败求助
解决WPBakery Product Loop隐藏缺货产品的问题
Hey Diego, 我来帮你搞定这个问题!你之前直接在查询参数里加stock_status没生效,是因为WooCommerce的库存状态并不是WP_Query的原生参数,它存在产品的post meta(_stock_status)里,得用meta_query来过滤才行。下面给你两种可行的解决方法:
方法一:直接修改组件代码里的查询参数
把你原来的代码改成这样,添加meta_query来筛选库存状态为「有库存」的产品:
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; switch ($display) { case 'recent': $args = array( 'post_type' => 'product', 'post_status' => 'publish', 'paged' => $paged, 'meta_query' => array( array( 'key' => '_stock_status', 'value' => 'instock', 'compare' => '=' ) ), // 保留原有的排序规则(按最新发布排序) 'orderby' => 'date', 'order' => 'DESC' ); break; // 其他case分支保持不变 }
方法二:用钩子修改(避免主题/插件更新覆盖代码)
如果直接改WPBakery组件代码担心后续更新被覆盖,推荐用WPBakery的vc_build_query_args钩子来修改查询。把这段代码加到你的主题functions.php文件里就行:
add_filter('vc_build_query_args', 'exclude_out_of_stock_vc_product_loop', 10, 2); function exclude_out_of_stock_vc_product_loop($query_args, $query_settings) { // 只针对「Recent」排序的Product Loop生效 if (isset($query_settings['display']) && $query_settings['display'] === 'recent') { $query_args['meta_query'][] = array( 'key' => '_stock_status', 'value' => 'instock', 'compare' => '=' ); } return $query_args; }
额外提示:处理可变产品
如果你的店铺有可变产品(Variable Product),上面的代码只会筛选简单产品的库存状态。要是想显示「至少有一个变体有库存」的可变产品,可以把meta_query改成这样:
'meta_query' => array( 'relation' => 'OR', // 简单产品有库存 array( 'key' => '_stock_status', 'value' => 'instock', 'compare' => '=' ), // 可变产品至少有一个变体库存>0 array( 'key' => '_stock', 'value' => 0, 'compare' => '>', 'type' => 'numeric' ) )
这样就能同时覆盖简单产品和可变产品的场景啦~
内容的提问来源于stack exchange,提问作者Diego Gaona
相关产品推荐
相关产品推荐

