如何实现WooCommerce仅手动确认订单后才扣减库存?
WooCommerce 修改库存扣减逻辑:订单确认后再扣减
实现步骤
要实现“订单确认后再扣减库存”的需求,需分两步操作:禁用默认的下单自动扣库存行为,然后添加订单确认时的库存扣减逻辑。
1. 禁用默认下单扣库存行为
将以下代码添加到你的主题functions.php文件或自定义插件中,阻止WooCommerce在订单创建时自动扣减库存:
// 禁用订单创建时的自动库存扣减 add_filter( 'woocommerce_prevent_automatic_product_stock_reduction', '__return_true' ); // 可选:禁用未确认订单的库存锁定(若不需要为未付款订单预留库存) add_filter( 'woocommerce_hold_stock_for_checkout', '__return_false' );
2. 添加订单确认时的库存扣减逻辑
当你在后台手动将订单状态改为「处理中(Processing)」或「已完成(Completed)」时,触发库存扣减。以下代码兼容简单产品和可变产品的库存处理:
// 订单状态更新为处理中/已完成时执行库存扣减 add_action( 'woocommerce_order_status_processing', 'wc_reduce_stock_on_order_confirmation' ); add_action( 'woocommerce_order_status_completed', 'wc_reduce_stock_on_order_confirmation' ); function wc_reduce_stock_on_order_confirmation( $order_id ) { $order = wc_get_order( $order_id ); // 标记订单已处理库存,避免重复扣减 if ( get_post_meta( $order_id, '_stock_reduced', true ) ) { return; } foreach ( $order->get_items() as $item ) { $product = $item->get_product(); // 仅处理开启库存管理的产品 if ( ! $product || ! $product->managing_stock() ) { continue; } $quantity = $item->get_quantity(); $new_stock = $product->get_stock_quantity() - $quantity; // 更新库存数量 $product->set_stock_quantity( $new_stock ); $product->save(); // 添加库存变动日志 wc_update_product_stock( $product, -$quantity, 'order_' . $order_id ); } // 记录库存已处理状态 update_post_meta( $order_id, '_stock_reduced', 'yes' ); }
注意事项
- 建议将代码添加到子主题的
functions.php或自定义插件中,避免主题更新导致代码丢失。 - 若使用第三方库存管理插件,需测试代码兼容性,必要时调整逻辑适配插件规则。
- 测试时请创建测试订单,确认状态变更后库存是否正确扣减,同时排查是否存在重复扣减问题。
内容的提问来源于stack exchange,提问作者Harish Kumar
相关产品推荐
相关产品推荐

