如何将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
相关产品推荐
相关产品推荐

