如何在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' );
验证步骤
- 确认订单自定义字段中
merchant_id存储的是对应商户的正确用户ID - 确认商户用户的元数据字段
businessname已正确存储企业名称 - 模拟订单转入处理中状态,测试邮件发件人是否正常替换为对应商户名称
内容的提问来源于stack exchange,提问作者Gabriel Meisel
相关产品推荐
相关产品推荐

