WooCommerce自定义字段未在邮件及后台订单信息中显示
嘿,我帮你捋捋这个WooCommerce自定义字段的问题!你说加了customer-id字段,结账时能用,但邮件里没它,后台订单页也看不到——这大概率是因为你只做了「显示字段」这一步,没把数据存进订单元数据,也没配置后台和邮件的显示逻辑。咱们一步步来修复:
修复WooCommerce自定义字段不显示在邮件和后台的问题
1. 先把字段数据存进订单元数据
你之前的代码可能只实现了结账页显示字段,但没把用户输入的内容保存到订单里。加上这段代码,确保数据能和订单绑定:
/** * 保存自定义字段到订单元数据 */ add_action('woocommerce_checkout_update_order_meta', 'save_my_custom_checkout_field'); function save_my_custom_checkout_field($order_id) { if (!empty($_POST['customer_id'])) { update_post_meta($order_id, '_customer_id', sanitize_text_field($_POST['customer_id'])); } }
⚠️ 注意:这里的$_POST['customer_id']要和你结账字段的name属性完全一致,_customer_id是订单元数据的键名(前面加下划线是WooCommerce的惯例,用来区分默认字段)。
2. 让字段显示在后台订单详情页
添加这段代码,把Customer ID放到后台订单的账单地址下方,管理员一眼就能看到:
/** * 在后台订单详情页显示自定义字段 */ add_action('woocommerce_admin_order_data_after_billing_address', 'display_my_custom_field_in_admin', 10, 1); function display_my_custom_field_in_admin($order) { $customer_id = get_post_meta($order->get_id(), '_customer_id', true); if (!empty($customer_id)) { echo '<div class="form-field form-field-wide"> <strong>Customer ID:</strong> ' . esc_html($customer_id) . ' </div>'; } }
3. 把字段加到订单确认邮件里
用这个钩子,让字段出现在给客户和管理员的所有订单通知邮件中:
/** * 给订单邮件添加自定义字段 */ add_filter('woocommerce_email_order_meta_fields', 'add_my_custom_field_to_emails', 10, 3); function add_my_custom_field_to_emails($fields, $sent_to_admin, $order) { $customer_id = get_post_meta($order->get_id(), '_customer_id', true); if (!empty($customer_id)) { $fields['_customer_id'] = array( 'label' => __('Customer ID', 'woocommerce'), 'value' => esc_html($customer_id), ); } return $fields; }
最后检查原有代码
确认你之前添加结账字段的代码里,输入框的name属性是customer_id,比如:
function my_custom_checkout_field() { echo '<div id="my_custom_checkout_field"> <h3>' . __('Customer ID', 'woocommerce') . '</h3> <p class="form-row form-row-wide"> <label for="customer_id">' . __('请输入你的客户ID', 'woocommerce') . '<span class="required">*</span></label> <input type="text" class="input-text" name="customer_id" id="customer_id" value="' . esc_attr($_POST['customer_id'] ?? '') . '" /> </p> </div>'; }
如果name不对,前面的保存代码就抓不到用户输入的值,这是很容易踩的小坑。
把这些代码加到主题的functions.php里,或者用自定义代码插件(比如Code Snippets)来添加,避免主题更新丢失代码。
内容的提问来源于stack exchange,提问作者Spencer Phillips
相关产品推荐
相关产品推荐

