我有一个很大的问题要解决下面的 case .你能帮帮我吗?

What I need to do:

  1. 我需要创建一个额外的产品自定义域,比如技术规范(TECH_SPEC),管理员在创建/编辑产品时会填写这个域,所以我使用ACF插件.

  2. 这些技术信息只为管理员保留,所以我不想向客户展示它,但我需要在客户创建新订单时自动将它们添加到订单面板(后端),以及仅在新订单通知(邮箱)中将它们发送给管理员.

What I've tried to do:

  1. 我使用ACF插件创建了一个tech_spec字段,并将其显示在单一产品编辑页面上.

  2. 我使用钩子:woocommerce_before_add_to_cart_button在单个产品页面上实现了这个字段的数据,并使用了CSS来隐藏它们.

    PHP (functions.php):

add_action('woocommerce_before_add_to_cart_button','techspec_field');

function techspec_field(){
    global $product;
    ob_start(); ?>
        <div class="techspec-info">
            <textarea name="tech_spec"><?php the_field('tech_spec'); ?></textarea>
        </div>
    <?php
    $content = ob_get_contents();
    ob_end_flush();
    return $content;
}

CSS (style.css):

.techspec-info textarea {
display: none !important;
visibility: hidden;}
  1. 我创建了一个向购物车添加字段数据的函数.
add_filter('woocommerce_add_cart_item_data','techspec_add_item_data', 10,3);

function techspec_add_item_data($cart_item_data, $product_id, $variation_id)
{
    if(isset($_REQUEST['tech_spec']))
    {
        $cart_item_data['tech_spec'] = sanitize_text_field($_REQUEST['tech_spec']);
    }

    return $cart_item_data;
}
  1. 接下来,我实现了另一个在购物车和 checkout 页面中显示数据的函数.
add_filter('woocommerce_get_item_data','techspec_add_item_meta',10,2);

function techspec_add_item_meta($item_data, $cart_item)
{

    if(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;
}
  1. 在那之后,我创建了一个向新订单添加数据的函数.
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('Technical Specification', $values['tech_spec']);
    }
}

到目前为止,一切都很正常,但tech_Spec field的数据正在发送给所有收件人,包括客户.如何限制仅向管理员发送这些数据?我是说新的订单通知.如果你愿意帮助我,我将不胜感激.

我试过使用不同的解决方案,比如if($sent_to_admin),以及使用woocommerce_order_item_get_formatted_meta_data隐藏这些数据,但都不起作用,或者我做错了什么.首先要感谢您的帮助.

推荐答案

您将无法针对only管理员新订单邮箱通知,订单项目自定义元数据.

现在,要使此自定义订单项目元数据仅在Admin Single Order页面上可见,您需要更改最后一个函数中的"meta key",将其替换为一个以下划线开头的插头,例如_tech_spec,它将对客户和邮箱通知隐藏:

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']);
    }
}

如果您希望在管理订单上有一个可读的"meta key"名称替换,您将使用:

add_filter( 'woocommerce_order_item_display_meta_key', 'filter_order_item_display_meta_key', 10, 3 );
function filter_order_item_display_meta_key( $display_key, $meta, $item ) {
    // only on Admin
    if ( is_admin() && $display_key === '_tech_spec' ) {
        $display_key = __('Technical Specification', 'woocommerce');
    }
    return $display_key;
}

代码放在活动子主题(或活动主题)的函数.php文件中.经过测试,效果良好.

Php相关问答推荐

此行动未经授权.升级Laravel时

管理员订单列表中的自定义列与WooCommerce 8.6.1一起消失

在php中有没有办法比较两个包含相同枚举类型的枚举数组

在WooCommerce管理订单列表中显示项目总权重

PHP中冒号的奇怪用例

无法在WooCommerce中发送客户笔记邮箱通知

PHP原始数据读取引发max_input_vars错误

WooCommerce在购买后多次重定向

如何在Laravel Model中自定义多个日期属性的日期格式?

如何使用barryvdh/laravel-Snappy在两个打印页面上将表格分成两部分?

laravel Eloquent 模型的问题

根据小计向 WooCommerce Checkout 添加佣金

如何在 php 中获取正确的时间

根据页面的最后修订日期设置 MediaWiki 内部链接的样式

基于WooCommerce中的产品变体自定义感谢页面跳转

ACF 更新字段功能不更新 WordPress 中的任何数据

为 WordPress 页面创建新功能

yii2 sql迁移覆盖新更改的记录

php var_dump(1) 返回字符串(4)

如何在字符串constant-string-NUMBER-*中获取 NUMBER?