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

WooCommerce中单个选项商品的缺货置灰功能失效问题

解决WooCommerce单选项商品缺货变体置灰失效的问题

我之前也碰到过一模一样的情况!你用的那段代码只能覆盖多属性变体的场景,因为WooCommerce在处理单一属性选项时,渲染逻辑和多属性不一样——它不会完全触发woocommerce_variation_is_active过滤器,导致缺货的选项没法被置灰禁用。

咱们可以调整代码,同时覆盖单属性和多属性的场景:

// 处理多属性变体的置灰逻辑(保留原代码逻辑)
add_filter( 'woocommerce_variation_is_active', 'grey_out_variations_when_out_of_stock', 10, 2 );
function grey_out_variations_when_out_of_stock( $is_active, $variation ) {
    if ( ! $variation->is_in_stock() ) {
        return false;
    }
    return $is_active;
}

// 新增:处理单属性选项的置灰禁用逻辑
add_filter( 'woocommerce_dropdown_variation_attribute_options_args', 'grey_out_single_attribute_out_of_stock', 10, 1 );
function grey_out_single_attribute_out_of_stock( $args ) {
    global $product;
    
    // 只针对单属性商品执行
    if ( count( $product->get_variation_attributes() ) !== 1 ) {
        return $args;
    }
    
    $attribute_name = key( $product->get_variation_attributes() );
    $options = $args['options'];
    
    foreach ( $options as $key => $option ) {
        // 匹配当前选项对应的变体ID
        $variation_id = $product->get_matching_variation( array( $attribute_name => $option ) );
        if ( $variation_id ) {
            $variation = wc_get_product( $variation_id );
            // 缺货则标记禁用并添加样式标识
            if ( ! $variation->is_in_stock() ) {
                $args['options'][$key] = '<span class="out-of-stock-variation">' . $option . '</span>';
                $args['disabled_options'][] = $option;
            }
        }
    }
    
    return $args;
}

再补充一点CSS让置灰效果更直观(可以加到主题的自定义CSS面板里):

.out-of-stock-variation {
    color: #999;
    font-style: italic;
}
select option:disabled {
    color: #999;
    font-style: italic;
}

这样修改后,不管是单属性还是多属性的商品,缺货的变体都会被置灰并禁用,用户没法选择啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:39:34