如何通过functions.php在WooCommerce中隐藏无库存的简单产品
WooCommerce自定义隐藏无库存商品方案
提示:请先在WooCommerce后台「设置-产品-库存」中关闭「隐藏无库存商品」选项,避免默认规则和自定义规则冲突。
以下代码可以实现两种场景的商品隐藏规则:
- 简单产品本身无库存时隐藏整个产品
- 可变产品的所有变体都无库存时隐藏整个产品,不会单独隐藏部分无库存的变体
将代码添加到当前主题的functions.php文件末尾,或者自定义代码插件的代码编辑区域即可生效:
add_action( 'woocommerce_product_query', 'custom_hide_oos_products', 10, 2 ); function custom_hide_oos_products( $q, $query ) { // 仅对前端主查询生效,不影响后台产品管理 if ( is_admin() || ! $q->is_main_query() ) return; $meta_query = $q->get( 'meta_query' ) ?: []; // 保留有库存的简单产品 $meta_query[] = [ 'key' => '_stock_status', 'value' => 'instock', 'compare' => '=' ]; $q->set( 'meta_query', $meta_query ); // 额外过滤全变体无库存的可变产品 add_filter( 'posts_where', 'filter_all_oos_variable_products', 10, 2 ); } function filter_all_oos_variable_products( $where, $wp_query ) { global $wpdb; // 执行一次后移除钩子避免重复查询 remove_filter( 'posts_where', 'filter_all_oos_variable_products', 10, 2 ); // 排除所有变体都无库存的可变产品 $where .= " AND ( {$wpdb->posts}.post_type != 'variable' OR EXISTS ( SELECT 1 FROM {$wpdb->posts} p INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_parent = {$wpdb->posts}.ID AND p.post_type = 'product_variation' AND p.post_status = 'publish' AND pm.meta_key = '_stock_status' AND pm.meta_value = 'instock' ) )"; return $where; }
生效校验
添加代码后清理站点缓存、WooCommerce后台缓存和浏览器缓存,分别测试以下场景即可:
- 无库存的简单产品:前端列表/搜索页不再展示
- 存在部分有库存变体的可变产品:正常展示,用户仍可选择有库存的变体
- 所有变体都无库存的可变产品:前端列表/搜索页不再展示
内容的提问来源于stack exchange,提问作者MrLucas
相关产品推荐
相关产品推荐

