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

