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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:45:09