如何让自定义字段替代的WooCommerce配送地址显示在订单邮件中?
解决WooCommerce自定义配送地址字段在订单邮件不显示的问题
方案一:同步自定义字段到原生配送地址字段(推荐)
核心是把你自定义的配送地址字段值同步到WooCommerce原生的shipping_address_1字段,这样所有依赖原生字段的功能(包括订单邮件)都会正常工作。
把以下代码添加到主题的functions.php文件,或者自定义插件中:
// 同步自定义配送地址到WooCommerce原生字段 add_action('woocommerce_checkout_create_order', 'sync_custom_shipping_to_native', 10, 2); function sync_custom_shipping_to_native($order, $checkout_data) { // 替换成你实际使用的自定义字段name $custom_addr = isset($_POST['custom_shipping_address_1']) ? sanitize_text_field($_POST['custom_shipping_address_1']) : ''; if (!empty($custom_addr)) { // 更新订单的原生配送地址1 $order->set_shipping_address_1($custom_addr); // 如果还有其他自定义配送字段(比如地址2、城市),参照下面的方式同步 // $custom_addr2 = isset($_POST['custom_shipping_address_2']) ? sanitize_text_field($_POST['custom_shipping_address_2']) : ''; // $order->set_shipping_address_2($custom_addr2); // $custom_city = isset($_POST['custom_shipping_city']) ? sanitize_text_field($_POST['custom_shipping_city']) : ''; // $order->set_shipping_city($custom_city); } }
注意:要把代码里的custom_shipping_address_1替换成你结账页面实际使用的自定义字段名称(可以通过浏览器开发者工具查看字段的name属性)。如果有其他自定义配送字段,按注释里的逻辑添加同步即可。
方案二:直接修改订单邮件模板显示自定义字段
如果不想同步字段,也可以直接修改邮件模板,强制显示自定义字段的内容:
- 在你的主题根目录下新建
woocommerce/emails文件夹 - 复制WooCommerce插件目录中
templates/emails/email-addresses.php文件到这个新建的文件夹 - 打开复制后的文件,找到配送地址的输出区块(在
if ( $order->needs_shipping_address() )代码块内) - 找到原生的
get_shipping_address_1()调用,替换为自定义字段的取值:
// 替换原有配送地址1的输出代码 $custom_shipping_addr = get_post_meta( $order->get_id(), '_custom_shipping_address_1', true ); echo wp_kses_post( $custom_shipping_addr . '<br/>' );
如果需要兼容原生字段(比如自定义字段为空时显示原生值),可以写成:
$custom_shipping_addr = get_post_meta( $order->get_id(), '_custom_shipping_address_1', true ); $display_addr = !empty($custom_shipping_addr) ? $custom_shipping_addr : $order->get_shipping_address_1(); echo wp_kses_post( $display_addr . '<br/>' );
注意:_custom_shipping_address_1是自定义字段存储在订单元数据中的键名,通常插件添加的字段会带下划线前缀,你可以在WooCommerce订单编辑页面的「自定义字段」区域查看实际键名,或者通过数据库的wp_postmeta表确认。
额外排查点
- 确认自定义结账字段插件已经把字段值保存到了订单的元数据中
- 如果使用方案一,测试结账流程,查看订单编辑页面的配送地址是否已经同步为自定义字段的值
内容的提问来源于stack exchange,提问作者hany kiriazi
相关产品推荐
相关产品推荐

