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

基于订单元数据自定义WooCommerce邮件发件人

WooCommerce多站点存储箱预订邮件发件人自定义问题

需求背景

我正在为客户开发一款WooCommerce插件,支持客户通过复杂表单预订多站点下的特定存储箱。由于每个存储箱归属对应站点,需要实现:根据存储箱所属站点设置邮件发件人(至少是回复地址)——比如预订站点1的A箱,邮件发件人为site1@domain.ext;预订站点2的B箱,发件人为site2@domain.ext,让客户回复邮件时自动发送到对应站点邮箱。

遇到的问题

尝试使用woocommerce_email_headers过滤器,它包含三个参数:

  • $headers:邮件当前头信息
  • $email_id:邮件标识符
  • $object:邮件关联对象(可为产品、客户等)
    但查阅代码参考发现,该过滤器从未被用于customer_processing_order邮件,无法通过此方法获取关联的WC_Order对象(或ID)来实现需求。

理想实现代码

/**
 * 为对应站点自定义邮件发件人(邮件头)
 * 钩子到过滤器或动作的函数
 *
 * @param string $headers   当前邮件头
 * @param string $email_id  邮件标识符
 * @param WC_Order $order   订单对象
 * 
 * @return string; 
 */
public function wc_customize_email_headers( $headers, $email_id, $order ) {
    
    if( $email_id == 'customer_processing_order' ) {
        // 通过$order对象实现自定义逻辑
        // 根据需要修改邮件头
    }

    return $headers;
}

补充:适配方案后仍无效

按照建议调整代码后,日志显示已设置目标头信息:

From: Site 1 <site1@domain.ext>

但实际收到的邮件仍来自默认管理员邮箱,当前使用的代码如下:

/**
 * 为对应站点自定义邮件发件人(邮件头)
 *
 * @param string $headers   当前邮件头
 * @param string $email_id  邮件标识符
 * @param WC_Order $order   订单对象
 * 
 * @return string;
 */
add_filter( 'woocommerce_email_headers', 'wc_customize_email_headers', 10, 3);
function wc_customize_email_headers( $headers, $email_id, $order ) {
    
    // 获取订单ID和订单对象
    $order_id = method_exists( $order, 'get_id' ) ? $order->get_id() : $order->id;
    $order = wc_get_order( $order_id );
    
    if( in_array( $email_id , [ 'customer_processing_order', 'new_order' ] ) ) {
       // 设置邮件头示例
       $site_expeditor = 'From: Site 1 <site1@domain.ext>';
    }

    return $headers;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:41:13