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

WooCommerce订单邮件未显示自定义配送手机号问题求助

解决WooCommerce配送手机号不显示在订单邮件中的问题

我懂你的困扰——已经成功在结账页面加了配送手机号字段,后台能正常看到,但就是出现在订单邮件里。你尝试的代码方向是对的,但有几个小细节需要调整,我帮你梳理下:

问题分析

你用的woocommerce_email_order_meta_fields过滤器里有两个关键问题:

  • 元键写错了:应该用实际存储的_shipping_phone,而不是meta_key
  • 调用订单ID的方式过时了:WooCommerce新版本里$order->id已经被弃用,要改用$order->get_id();另外更推荐用$order->get_meta()来获取订单元数据,比get_post_meta()更符合WooCommerce的规范

修正后的代码方案

方案1:修复你原来的过滤器代码

把你尝试的邮件代码换成下面这段:

add_filter( 'woocommerce_email_order_meta_fields', 'custom_woocommerce_email_order_meta_fields', 10, 3 );
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
    // 检查是否存在配送手机号元数据
    if ( $shipping_phone = $order->get_meta( '_shipping_phone' ) ) {
        $fields['_shipping_phone'] = array(
            'label' => __( 'Shipping Phone' ),
            'value' => $shipping_phone,
        );
    }
    return $fields;
}

方案2:在邮件的配送地址区域显示(更贴合布局)

如果你希望手机号直接显示在订单邮件的配送地址部分,和其他配送信息放在一起,用这个钩子会更合适:

add_action( 'woocommerce_email_after_order_table', 'add_shipping_phone_to_email', 10, 4 );
function add_shipping_phone_to_email( $order, $sent_to_admin, $plain_text, $email ) {
    $shipping_phone = $order->get_meta( '_shipping_phone' );
    if ( ! empty( $shipping_phone ) ) {
        if ( $plain_text ) {
            echo "\nShipping Phone: " . $shipping_phone . "\n";
        } else {
            echo '<p><strong>Shipping Phone:</strong> ' . esc_html( $shipping_phone ) . '</p>';
        }
    }
}

为什么这样改?

  1. 用$order->get_meta()直接获取订单元数据,是WooCommerce官方推荐的方式,兼容性更好
  2. 增加了非空判断,避免在没有填写手机号时显示空字段
  3. 方案2同时支持纯文本和HTML格式的邮件,适配所有WooCommerce邮件模板

另外,你之前添加字段和后台显示的代码是没问题的,替换邮件相关的代码后,测试下新订单的邮件就能看到配送手机号了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:07:05