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

如何仅在管理员新订单通知中显示WooCommerce订单项自定义元数据

解决WooCommerce中ACF自定义字段仅在管理员订单邮件显示的问题

需求

  • 通过ACF插件创建产品编辑页的自定义字段tech_spec(技术规格),仅对管理员可见
  • 该字段不展示给客户,但下单时自动同步至后台订单面板,且仅在管理员的新订单通知邮件中显示

已实现的操作

  1. 通过ACF创建tech_spec字段并在产品编辑页正常显示
  2. 添加前端隐藏字段并同步到购物车
  3. 实现购物车/结账页面显示字段数据
  4. 将字段数据同步到订单行项目

但当前存在问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:57:48