如何将指定SKU及属性的WooCommerce变体状态从outofstock改为onbackorder
如何将指定WooCommerce变体从缺货改为预售状态
需求:通过SKU、属性名及属性值,把Variable Product的指定Variation状态从outofstock改为onbackorder(支持预售),目标变体信息如下:
sku = 'TEST-001'; attribute_name = 'pa_size'; value = '35';
先看你提供的代码,逻辑方向是对的,但存在局限,下面详细说明:
你的代码问题分析
你用woocommerce_available_variation过滤器修改前端变体数据的思路没问题,但只设置$data['backorders'] = 'yes'不够:
- 仅修改前端显示,不会改动后台变体的实际设置,后台依然显示缺货状态;
- 缺少库存状态和购买权限的调整,前端可能还是显示缺货,用户无法下单。
修正方案
方案1:前端临时生效(不修改后台)
如果只是想让前端显示预售、允许用户下单,不改动后台设置,用下面的代码:
add_filter( 'woocommerce_available_variation', 'enable_backorders_for_variation', 10, 3 ); function enable_backorders_for_variation( $data, $product, $variation ) { $sku_to_find = 'TEST-001'; $attribute_name = 'pa_size'; $target_value = '35'; // 同时匹配SKU和属性 if ( $variation->get_sku() === $sku_to_find && isset( $variation->get_attributes()[$attribute_name] ) && $variation->get_attributes()[$attribute_name] === $target_value ) { // 开启预售 $data['backorders'] = 'yes'; // 标记为可售,允许用户购买 $data['is_in_stock'] = true; $data['is_purchasable'] = true; // 替换库存提示文本为预售信息 $data['availability_html'] = '<p class="stock onbackorder">预售中,下单后到货即发</p>'; } return $data; }
方案2:永久修改后台设置
如果需要让变体的预售状态在后台永久生效,用下面的代码(执行一次后删除,避免重复修改):
function update_variation_to_backorder() { $sku_to_find = 'TEST-001'; $attribute_name = 'pa_size'; $target_value = '35'; // 通过SKU获取变体ID $variation_id = wc_get_product_id_by_sku( $sku_to_find ); if ( !$variation_id ) return; $variation = wc_get_product( $variation_id ); if ( !$variation || !$variation->is_type('variation') ) return; // 验证属性是否匹配 $attributes = $variation->get_attributes(); if ( isset( $attributes[$attribute_name] ) && $attributes[$attribute_name] === $target_value ) { // 设置允许预售 $variation->set_backorders('yes'); // 设置库存状态为预售 $variation->set_stock_status('onbackorder'); // 保存修改到数据库 $variation->save(); } } // 执行修改,刷新网站后删除这一行 update_variation_to_backorder();
关键注意事项
- 代码里的
$target_value要匹配属性的slug,不是后台显示的属性名称。比如后台属性显示"35",但slug可能是"size-35",需要去WooCommerce属性设置里确认; - 建议把代码添加到子主题的
functions.php中,避免主题更新时丢失; - 永久修改的代码只需要执行一次,刷新网站后记得删除
update_variation_to_backorder();这一行,不然每次加载页面都会重复执行修改。
内容的提问来源于stack exchange,提问作者Stan Law
相关产品推荐
相关产品推荐

