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

WooCommerce根据库存与SKU前缀置灰商品变体实现方法

WooCommerce按SKU前缀+库存条件禁用指定变体实现

问题场景

  • 存在1个包含2个变体的WooCommerce可变商品,所有变体共用商品层级库存,初始库存为3
  • 两个变体对应购买规则:
    • 1积分购买
    • 3积分购买
  • 已完成自定义库存扣减逻辑开发:
    • 用户选择3积分购买时一次性扣减3个库存,库存归0后商品自动隐藏
    • 用户选择1积分购买时扣减1个库存,扣减完成后库存剩余2
  • 待实现需求:当商品总库存小于等于2时,SKU以003开头的「3积分购买」变体自动置为不可用/隐藏
  • 现有基础代码仅实现了库存为2时全量变体置灰的逻辑,缺少SKU前缀校验,代码如下:
add_filter( 'woocommerce_variation_is_active', 'grey_out_variations_out_of_stock', 10, 2 );
 
function grey_out_variations_out_of_stock( $is_active, $variation ) {
    if ( $variation->get_stock_quantity() == 2 ) return false;
    return $is_active;
}

实现代码

原有代码存在两个问题:一是直接读取变体库存,没有读取商品层级的总库存;二是没有加SKU前缀判断,会把所有变体都置灰。修改后完整代码如下:

add_filter( 'woocommerce_variation_is_active', 'grey_out_variations_out_of_stock', 10, 2 );
 
function grey_out_variations_out_of_stock( $is_active, $variation ) {
    // 获取变体所属父商品,读取商品层级总库存
    $parent_product = wc_get_product( $variation->get_parent_id() );
    $total_stock = $parent_product->get_stock_quantity();
    // 获取当前变体SKU
    $sku = $variation->get_sku();

    // 同时满足库存<=2、SKU以003开头两个条件时,禁用该变体
    if ( $total_stock <= 2 && str_starts_with( $sku, '003' ) ) {
        return false;
    }
    return $is_active;
}

低版本PHP兼容说明

如果站点使用的PHP版本低于8.0,原生不支持str_starts_with函数,可以将判断逻辑替换为substr前缀匹配写法:

if ( $total_stock <= 2 && substr( $sku, 0, 3 ) === '003' ) {
    return false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:51:30