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
相关产品推荐
相关产品推荐

