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

WooCommerce发送新订单邮件前更新地址应使用哪个钩子?

解决WooCommerce订单邮件未显示更新后地址的问题

你当前用的woocommerce_thankyou钩子执行时机太晚——它是在订单确认页面加载时触发的,这时候订单通知邮件已经发出去了,所以你更新的地址不会同步到邮件里。

要在邮件发送前更新地址,推荐用以下两种方案:

方案一:订单处理完成、邮件发送前更新地址

用woocommerce_checkout_order_processed钩子,这个钩子会在订单创建成功、邮件发送之前触发,是修改订单数据的最佳时机。同时建议用WooCommerce订单对象的内置方法更新地址,而非直接操作post meta,确保数据一致性:

add_action( 'woocommerce_checkout_order_processed', 'update_order_address_before_email', 10, 3 );
function update_order_address_before_email( $order_id, $posted_data, $order ) {
    $my_custom_address = 'My custom address';
    
    // 更新账单地址第一行
    $order->set_billing_address_1( $my_custom_address );
    // 更新配送地址第一行
    $order->set_shipping_address_1( $my_custom_address );
    
    // 保存订单更改
    $order->save();
}

这个钩子的三个参数分别是订单ID、结账提交的表单数据、订单对象,直接用传入的$order对象更高效,不用再调用wc_get_order()。

方案二:邮件生成时修改地址显示

如果只需要在邮件里改地址展示,不想改动后台订单数据,可以用woocommerce_email_before_order_table钩子,在邮件渲染时替换地址内容:

add_action( 'woocommerce_email_before_order_table', 'modify_address_in_order_email', 10, 4 );
function modify_address_in_order_email( $order, $sent_to_admin, $plain_text, $email ) {
    // 只针对新订单通知邮件生效
    if ( $email->id !== 'new_order' ) return;
    
    $my_custom_address = 'My custom address';
    
    // 临时修改订单对象的地址(仅当前邮件渲染时生效)
    $order->set_billing_address_1( $my_custom_address );
    $order->set_shipping_address_1( $my_custom_address );
}

这个方案不会修改后台的订单数据,只会在邮件里显示自定义地址。

内容的提问来源于stack exchange,提问作者Chan Dinh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:25:38