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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:23:41