WooCommerce:寻找提交订单后跳转支付处理器前的Action Hook
解决WooCommerce中支付跳转前触发邮件的问题
看起来你已经试过不少钩子了,但没找到刚好卡在「点击Place Order后、跳转支付网关前」的那个点——我帮你梳理下正确的方案,顺便解释下你之前试的那些钩子为什么不符合需求。
首先,先明确你的需求核心:订单已创建(有完整订单数据),但还没跳转到PayPal/Przelewy24等支付处理器,这时候触发邮件函数。
先帮你排除之前的钩子为什么不合适:
woocommerce_checkout_process/woocommerce_before_checkout_process:这俩是表单验证阶段触发的,订单还没创建,拿不到订单数据,没法发订单相关邮件woocommerce_review_order_after_submit:这是前端页面渲染时的钩子,在按钮显示的时候就触发了,不是用户点击之后woocommerce_thankyou/woocommerce_payment_complete/各类订单状态变更钩子:这些都是支付完成后才触发的,太晚了woocommerce_email_before_order_table:这是WooCommerce默认邮件发送时的钩子,只能跟着系统默认邮件走,没法自定义触发时机
正确的钩子方案(两种,按需选)
方案1:woocommerce_checkout_order_processed(推荐)
这个钩子的触发时机完美匹配你的需求:订单已保存到数据库,支付网关尚未开始处理/跳转。你之前可能没注意到参数传递的问题,导致函数没正常运行,调整下代码即可:
// 注意第三个参数是3,代表接收3个钩子参数 add_action( 'woocommerce_checkout_order_processed', array( $this, 'trigger' ), 1, 3 ); // 你的trigger函数需要接收参数 public function trigger( $order_id, $posted_data, $order ) { // 确保拿到有效的订单对象 if ( ! $order instanceof WC_Order ) { $order = wc_get_order( $order_id ); } // 这里写你的邮件发送逻辑 $customer_email = $order->get_billing_email(); $subject = '订单确认:即将跳转支付'; $message = "感谢你的订单,订单号:{$order->get_order_number()},我们正在为你跳转至支付页面..."; // 用WooCommerce兼容的wp_mail发送 wp_mail( $customer_email, $subject, $message ); }
方案2:woocommerce_payment_gateway_before_process_payment(针对特定网关)
如果方案1遇到部分支付网关「即时跳转中断脚本」的问题(比如有些网关会用exit()强制跳转),可以用这个网关专属钩子,它会在每个支付网关处理支付前触发,还能指定只针对PayPal/Przelewy24:
add_action( 'woocommerce_payment_gateway_before_process_payment', array( $this, 'trigger' ), 10, 2 ); public function trigger( $order_id, $gateway ) { $order = wc_get_order( $order_id ); // 只在目标支付网关触发 if ( in_array( $gateway->id, array( 'paypal', 'przelewy24' ) ) ) { // 邮件发送逻辑 wp_mail( $order->get_billing_email(), '支付跳转提醒', "你的订单 {$order->get_order_number()} 即将进入支付环节,请完成支付。" ); } }
额外注意点
- 测试时可以开启WooCommerce调试模式(在
wp-config.php里加define( 'WC_DEBUG', true );),确认钩子是否被正确触发 - 如果邮件发送不稳定,建议用SMTP插件(比如WP Mail SMTP)替代服务器默认邮件配置,提升送达率
内容的提问来源于stack exchange,提问作者Rtrax
相关产品推荐
相关产品推荐

