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>'; } } }
为什么这样改?
- 用
$order->get_meta()直接获取订单元数据,是WooCommerce官方推荐的方式,兼容性更好 - 增加了非空判断,避免在没有填写手机号时显示空字段
- 方案2同时支持纯文本和HTML格式的邮件,适配所有WooCommerce邮件模板
另外,你之前添加字段和后台显示的代码是没问题的,替换邮件相关的代码后,测试下新订单的邮件就能看到配送手机号了。
内容的提问来源于stack exchange,提问作者jeet singh
相关产品推荐
相关产品推荐

