如何仅在管理员新订单通知中显示WooCommerce订单项自定义元数据
解决WooCommerce中ACF自定义字段仅在管理员订单邮件显示的问题
需求
- 通过ACF插件创建产品编辑页的自定义字段
tech_spec(技术规格),仅对管理员可见 - 该字段不展示给客户,但下单时自动同步至后台订单面板,且仅在管理员的新订单通知邮件中显示
已实现的操作
- 通过ACF创建
tech_spec字段并在产品编辑页正常显示 - 添加前端隐藏字段并同步到购物车
- 实现购物车/结账页面显示字段数据
- 将字段数据同步到订单行项目
但当前存在问题:tech_spec字段数据会出现在所有收件人的订单邮件中(包括客户),尝试过$sent_to_admin及woocommerce_order_item_get_formatted_meta_data钩子未解决。
解决方案
1. 优化前端隐藏字段(更安全)
替换原前端字段输出代码,使用hidden输入框,并仅对管理员输出:
add_action('woocommerce_before_add_to_cart_button','techspec_field'); function techspec_field(){ global $product; $tech_spec = get_field('tech_spec', $product->get_id()); // 仅管理员能输出该字段,避免非管理员提交无效数据 if( $tech_spec && current_user_can('manage_options') ){ echo '<input type="hidden" name="tech_spec" value="' . esc_attr($tech_spec) . '">'; } }
2. 修改订单元数据存储方式(默认隐藏给客户)
将订单行项目的元数据改为下划线前缀,WooCommerce默认不会展示带下划线的元数据给客户:
add_action( 'woocommerce_checkout_create_order_line_item', 'techspec_add_custom_order_line_item_meta', 10,4 ); function techspec_add_custom_order_line_item_meta($item, $cart_item_key, $values, $order){ if(array_key_exists('tech_spec', $values)){ // 下划线前缀标记为管理员专属元数据,默认不显示给客户 $item->add_meta_data('_tech_spec', $values['tech_spec'], true); } }
3. 过滤邮件元数据,仅管理员邮件显示
通过钩子在管理员订单邮件中显示该字段,同时确保客户邮件中不出现:
add_filter('woocommerce_order_item_get_formatted_meta_data', 'show_tech_spec_in_admin_emails', 10, 2); function show_tech_spec_in_admin_emails($formatted_meta, $item){ $is_admin_context = is_admin() || ( isset( $GLOBALS['email'] ) && $GLOBALS['email']->id === 'new_order' && $GLOBALS['email']->is_sent_to_admin() ); // 管理员上下文:添加技术规格元数据 if( $is_admin_context ){ $tech_spec = $item->get_meta('_tech_spec'); if( $tech_spec ){ $formatted_meta[] = (object) array( 'key' => 'Technical Specification', 'value' => wp_kses_post($tech_spec), 'display_key' => 'Technical Specification', 'display_value' => wp_kses_post($tech_spec), ); } } // 非管理员上下文:移除可能存在的技术规格元数据 foreach( $formatted_meta as $key => $meta ){ if( !$is_admin_context && $meta->key === 'Technical Specification' ){ unset($formatted_meta[$key]); } } return $formatted_meta; }
4. 优化购物车/结账页面显示(仅管理员可见)
修改原购物车显示逻辑,仅管理员能在购物车和结账页看到该字段:
add_filter('woocommerce_get_item_data','techspec_add_item_meta',10,2); function techspec_add_item_meta($item_data, $cart_item){ // 仅管理员可见购物车中的技术规格 if( current_user_can('manage_options') && array_key_exists('tech_spec', $cart_item) ){ $custom_details = $cart_item['tech_spec']; $item_data[] = array( 'key' => 'Technical Specification', 'value' => $custom_details ); } return $item_data; }
说明
- 使用下划线前缀存储元数据是WooCommerce的默认约定,这类元数据不会主动展示给客户
- 通过
woocommerce_order_item_get_formatted_meta_data钩子区分上下文,确保仅管理员能看到该字段 - 前端字段添加管理员权限判断,进一步提升数据安全性
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

