基于配送方式ID触发订单处理额外邮件通知的问题求助
解决Woocommerce按配送方式ID添加额外邮件收件人问题
你的问题核心在于原钩子仅针对「新订单通知」(new_order),如果需要针对「订单处理中通知」(customer_processing_order)或其他邮件类型生效,需要使用支持$email_id参数的动态钩子,同时确保配送方式ID的获取逻辑准确。
修改后的代码
add_filter( 'woocommerce_email_recipient_new_order', 'add_recipients_by_shipping_method', 20, 3 ); add_filter( 'woocommerce_email_recipient_customer_processing_order', 'add_recipients_by_shipping_method', 20, 3 ); function add_recipients_by_shipping_method( $recipient, $order, $email ) { // 验证订单对象和邮件对象 if ( ! is_a( $order, 'WC_Order' ) || ! is_a( $email, 'WC_Email' ) ) { return $recipient; } // 配置收件邮箱和对应配送方式ID $shipping_recipients = [ 'flat_rate:8' => 'name1@domain.com', 'flat_rate:9' => 'name2@domain.com' ]; // 获取订单的配送方式ID $shipping_method_id = ''; foreach ( $order->get_items('shipping') as $shipping_item ) { $shipping_method_id = $shipping_item->get_method_id() . ':' . $shipping_item->get_instance_id(); break; // 取第一个配送方式(一般订单仅一个) } // 如果匹配到对应配送方式,添加收件人 if ( isset( $shipping_recipients[$shipping_method_id] ) ) { // 避免重复添加 if ( strpos( $recipient, $shipping_recipients[$shipping_method_id] ) === false ) { $recipient .= ',' . $shipping_recipients[$shipping_method_id]; } } return $recipient; }
关键修改说明
- 多邮件类型支持:同时挂钩
new_order和customer_processing_order两个邮件通知,你可以根据需求添加或移除其他邮件类型(如customer_completed_order)。 - 参数完整性:钩子的第三个参数是
$email对象,通过它可以精准判断邮件类型(比如$email->id可获取邮件ID)。 - 配送方式ID验证:使用循环获取配送方式ID,兼容极端情况下的多配送方式场景,同时避免原代码中
reset()可能导致的空值问题。 - 重复收件人防护:通过
strpos检查收件人是否已存在,避免重复添加。
调试技巧
如果仍未生效,先确认配送方式ID是否正确:
- 在订单详情页添加临时代码打印ID:
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'print_shipping_method_id', 10, 1 ); function print_shipping_method_id( $order ) { foreach ( $order->get_items('shipping') as $shipping_item ) { echo '<p><strong>配送方式ID:</strong>' . $shipping_item->get_method_id() . ':' . $shipping_item->get_instance_id() . '</p>'; } } - 登录后台查看订单详情页的配送地址下方,即可看到实际的配送方式ID,确保代码中的ID与实际一致。
内容的提问来源于stack exchange,提问作者avidart
相关产品推荐
相关产品推荐

