WooCommerce根据配送项设置新订单邮件回复地址问题咨询
WooCommerce新订单邮件按配送方式修改唯一Reply-To地址解决方案
出现双回复地址的核心原因是原代码直接在系统生成的原始邮件头后追加自定义Reply-To字段,没有先清除默认的Reply-To配置,导致两个规则同时生效。另外原代码中定义了允许修改的邮件ID数组但未加入判断逻辑,会导致所有站点邮件都被修改回复地址。
修正后代码
add_filter( 'woocommerce_email_headers', 'add_headers_replay_to_conditionally', 10, 3 ); function add_headers_replay_to_conditionally( $headers, $email_id, $order ) { // 避免错误 if ( ! is_a( $order, 'WC_Order' ) || ! isset( $email_id ) ) return $headers; // 仅对指定邮件通知生效 $allowed_email_ids = array('customer_on_hold_order', 'woocommerce_new_order'); if( !in_array( $email_id, $allowed_email_ids ) ) return $headers; // 获取配送项 $shipping_items = $order->get_items('shipping'); $shipping_item = reset($shipping_items); $shipping_name = $shipping_item->get_name(); // 配送方式与邮箱映射表,后续新增规则直接修改此处即可 $shipping_email_map = [ 'Afhalen in Utrecht' => 'utrecht@x.nl', 'Bezorgen vanuit Utrecht' => 'utrecht@x.nl', 'Afhalen in Amsterdam' => 'amsterdam@x.nl', 'Bezorgen vanuit Amsterdam' => 'amsterdam@x.nl', 'Bezorgen in Amersfoort (gratis vanaf €50 ex btw bestelwaarde)' => 'amersfoort@x.nl' ]; // 匹配对应邮箱,默认用info@x.nl $custom_reply_to = isset( $shipping_email_map[$shipping_name] ) ? $shipping_email_map[$shipping_name] : 'info@x.nl'; // 清除原有Reply-To,避免重复 if( is_string( $headers ) ){ // 兼容旧版WooCommerce headers为字符串的情况 $headers = preg_replace( '/Reply-To:.*\r?\n/i', '', $headers ); $headers .= "Reply-To: {$custom_reply_to}\r\n"; } else { // 新版WooCommerce headers为数组的情况 unset( $headers['Reply-To'] ); $headers['Reply-To'] = $custom_reply_to; } return $headers; }
调整说明
- 新增了允许修改的邮件ID判断逻辑,仅对指定的两类订单邮件生效,不会影响其他站点邮件
- 优先清除了原有邮件头中已存在的Reply-To规则,彻底避免重复地址问题
- 兼容新旧版本WooCommerce的邮件头格式(字符串/数组),适配性更强
- 将配送方式与对应邮箱的映射整理为数组,后续新增规则时仅需修改映射表即可,无需重复编写判断逻辑,更易维护
内容的提问来源于stack exchange,提问作者rutvanelk
相关产品推荐
相关产品推荐

