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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:45:07