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

如何将WooCommerce新订单直接设为On hold,跳过Processing状态?

解决方案:让WooCommerce新订单直接锁定在On Hold状态,跳过Processing流转

嘿,我来帮你解决这个订单状态流转的问题!要实现"新订单直接设为On Hold、付款授权后也不跳到Processing"的需求,我们需要拦截两个核心的状态触发点,下面是具体的代码和说明:

核心逻辑

咱们要搞定两件事:

  • 新订单刚创建时,直接从默认的Pending Payment跳到On Hold,根本不给Processing状态出现的机会
  • 拦截付款授权完成后的自动状态变更,强制订单保持在On Hold,直到你手动确认收款

代码实现(直接用就行)

把这段代码加到你主题的functions.php里,或者用Code Snippets这类插件来添加(更安全,不用碰主题文件):

// 1. 新订单创建后直接设为On Hold,跳过Pending Payment → Processing
add_action('woocommerce_new_order', 'force_new_order_to_on_hold', 10, 1);
function force_new_order_to_on_hold($order_id) {
    if (!$order_id) return;
    
    $order = wc_get_order($order_id);
    // 只处理初始状态为pending的订单,避免影响其他场景
    if ($order->get_status() === 'pending') {
        $order->update_status('on-hold', '系统自动设置:等待商家确认收款');
        // 顺便禁用Processing状态的默认邮件,防止误发
        remove_action('woocommerce_order_status_processing_notification', array(WC()->mailer(), 'send_transactional_email'));
    }
}

// 2. 付款授权完成后,阻止订单自动切到Processing,保持On Hold
add_filter('woocommerce_payment_complete_order_status', 'keep_order_on_hold_post_payment', 10, 3);
function keep_order_on_hold_post_payment($status, $order_id, $order) {
    // 不管付款结果如何,都把状态锁在On Hold
    return 'on-hold';
}

// 可选:手动确认收款后,再触发给供应商的邮件
function send_supplier_email_when_order_confirmed($order_id) {
    $order = wc_get_order($order_id);
    // 只有当你手动把订单改成Processing时,才发邮件
    if ($order->get_status() === 'processing') {
        $mailer = WC()->mailer();
        $supplier_email = 'your-supplier@example.com'; // 替换成供应商的邮箱
        $subject = '已确认收款:订单 #' . $order->get_order_number();
        $email_content = "订单详情链接:{$order->get_view_order_url()}\n\n请及时处理该订单";
        
        $mailer->send($supplier_email, $subject, $email_content);
    }
}
add_action('woocommerce_order_status_processing', 'send_supplier_email_when_order_confirmed', 10, 1);

代码说明

  • 第一个函数:在订单刚创建的瞬间,把默认的Pending状态直接改成On Hold,还顺便关掉了Processing状态的邮件触发,避免提前给供应商发邮件。
  • 第二个函数:拦截付款完成后的状态变更逻辑,强制让订单继续留在On Hold,完全切断了"付款授权→Processing"的流转。
  • 可选的第三个函数:当你确认收到款项后,手动把订单从On Hold改成Processing,这时候就会自动给供应商发邮件,完美匹配你的需求。

小提醒

  • 先备份网站再测试,避免代码和现有插件冲突。
  • 如果用了第三方支付插件,要是发现状态还是跳,就把钩子的优先级从10改成20(比如add_action(..., 20, 1)),确保咱们的代码在支付插件之后执行。
  • 订单备注里会显示我们设置的状态变更原因,方便你后续查账~

内容的提问来源于stack exchange,提问作者G Ritchie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:51:18