WooCommerce库存≤2时禁止购买产品变体的功能实现问题
解决方案:基于库存数量控制WooCommerce产品可购买状态
原代码问题分析
你当前的代码存在两个核心问题:
- 在
woocommerce_get_availability钩子内动态添加/移除woocommerce_is_purchasable过滤器是错误操作——过滤器是全局生效的,会导致所有产品的可购买状态被最后加载的产品设置覆盖,无法实现单个产品/变体的精准控制。 - 未处理产品变体的库存判断逻辑,仅针对简单产品做了处理。
修正后的代码实现
以下代码可同时处理简单产品和变体产品,严格按照需求(库存≤2时不可购买,库存>2时可购买,库存0时标记售罄)实现功能:
// 修改库存状态提示文本 function custom_woocommerce_get_availability( $availability, $product ) { // 开启库存管理的产品 if ( $product->managing_stock() ) { // 获取库存数量(变体产品需获取当前选中变体的库存) $stock_quantity = $product->is_type('variation') ? $product->get_stock_quantity() : $product->get_stock_quantity(); if ( $stock_quantity <= 0 ) { $availability['availability'] = __('OUT OF STOCK', 'woocommerce' ); $availability['class'] = 'out-of-stock'; // 添加上售罄样式类 } elseif ( $stock_quantity > 0 && $stock_quantity <= 2 ) { $availability['availability'] = __('Available in Store Only', 'woocommerce' ); $availability['class'] = 'in-store-only'; // 添加到店自提样式类 } elseif ( $stock_quantity >= 3 ) { $availability['availability'] = __('IN STOCK', 'woocommerce' ); $availability['class'] = 'in-stock'; // 添加库存充足样式类 } } else { // 未开启库存管理的产品 if ( $product->is_in_stock() ) { $availability['availability'] = __('库存开启,现货', 'woocommerce' ); } else { $availability['availability'] = __('库存关闭,缺货', 'woocommerce' ); } } return $availability; } add_filter( 'woocommerce_get_availability', 'custom_woocommerce_get_availability', 10, 2 ); // 控制产品是否可购买 function custom_woocommerce_is_purchasable( $purchasable, $product ) { // 仅对开启库存管理的产品生效 if ( $product->managing_stock() ) { // 获取对应库存数量 $stock_quantity = $product->is_type('variation') ? $product->get_stock_quantity() : $product->get_stock_quantity(); // 库存≤2时不可购买,>2时可购买 if ( $stock_quantity <= 2 ) { return false; } else { return true; } } // 未开启库存管理的产品保持原有状态 return $purchasable; } add_filter( 'woocommerce_is_purchasable', 'custom_woocommerce_is_purchasable', 10, 2 );
代码说明
- 将库存文本修改和可购买状态控制拆分为两个独立的过滤器函数,避免全局污染。
- 针对变体产品做了判断,通过
$product->is_type('variation')获取当前选中变体的库存数量,确保变体的状态判断准确。 - 为不同库存状态添加了对应的CSS类,方便前端自定义样式。
- 严格遵循需求逻辑:库存≤2(包含0)时不可购买,库存>2时可购买。
内容的提问来源于stack exchange,提问作者swagIT
相关产品推荐
相关产品推荐

