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

如何在WooCommerce邮件通知中从订单元数据取值修改发件人名称

WooCommerce按商户元数据修改邮件发件人名称解决方案

问题原因

你的代码失效的核心原因是PHP匿名函数默认不继承父作用域的变量,你在change_processing_sender_name函数里定义的$business_name没有传入过滤器的回调函数中,导致回调内的$business_name为未定义状态,自然无法修改发件人名称。

修复后的代码

function change_processing_sender_name($order_id){
    // 获取商户ID和企业名称
    $merchant_id = get_post_meta( $order_id, 'merchant_id', true );
    $business_name = get_user_meta($merchant_id,'businessname', true);

    // 用use将$business_name传入匿名函数作用域
    add_filter( 'woocommerce_email_from_name', function( $from_name, $wc_email ) use ($business_name){
        // 仅当获取到有效企业名称时替换,否则保留默认发件名
        return !empty($business_name) ? $business_name : $from_name;
    }, 10 ,2);
}
add_action( 'woocommerce_order_status_processing', 'change_processing_sender_name' );

可选优化

如果你想要避免这个过滤器影响其他类型的WooCommerce邮件,可以在回调里增加邮件类型判断,仅对处理中订单通知生效:

function change_processing_sender_name($order_id){
    $merchant_id = get_post_meta( $order_id, 'merchant_id', true );
    $business_name = get_user_meta($merchant_id,'businessname', true);

    add_filter( 'woocommerce_email_from_name', function( $from_name, $wc_email ) use ($business_name){
        // 仅针对处理中订单通知邮件修改发件人
        if( $wc_email->id === 'customer_processing_order' && !empty($business_name) ){
            return $business_name;
        }
        return $from_name;
    }, 10 ,2);
}
add_action( 'woocommerce_order_status_processing', 'change_processing_sender_name' );

验证步骤

  1. 确认订单自定义字段中merchant_id存储的是对应商户的正确用户ID
  2. 确认商户用户的元数据字段businessname已正确存储企业名称
  3. 模拟订单转入处理中状态,测试邮件发件人是否正常替换为对应商户名称

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:36:03