WooCommerce:将自定义 Metabox 添加到管理订单页面

2023-12-26

我目前已成功向我的 WooCommerce 产品页面添加一个字段,该字段显示值:

  • 在购物车(前端)中,
  • 在结账页面(前端),
  • 在订单页面(前端),
  • 并在管理个人订单页面(后端)中。

问题:它没有在管理订单“自定义字段”Metabox 中显示为自定义字段及其内部值,而只是在订单页面中显示为文本。

这是我的工作代码:

// Add the field to the product
add_action('woocommerce_before_add_to_cart_button', 'my_custom_checkout_field');

function my_custom_checkout_field() {
    echo '<div id="my_custom_checkout_field"><h3>'.__('My Field').'</h3>';
    echo  '<label>fill in this field</label> <input type="text" name="my_field_name">';
    echo '</div>';
}

// Store custom field
function save_my_custom_checkout_field( $cart_item_data, $product_id ) {
    if( isset( $_REQUEST['my_field_name'] ) ) {
        $cart_item_data[ 'my_field_name' ] = $_REQUEST['my_field_name'];
        /* below statement make sure every add to cart action as unique line item */
        $cart_item_data['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}
add_action( 'woocommerce_add_cart_item_data', 'save_my_custom_checkout_field', 10, 2 );

// Render meta on cart and checkout
function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
    $custom_items = array();
    /* Woo 2.4.2 updates */
    if( !empty( $cart_data ) ) {
        $custom_items = $cart_data;
    }
    if( isset( $cart_item['my_field_name'] ) ) {
        $custom_items[] = array( "name" => 'My Field', "value" => $cart_item['my_field_name'] );
    }
    return $custom_items;
}
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2 );

// This is what I think needs changing?

function subscription_order_meta_handler( $item_id, $values, $cart_item_key ) {
    if( isset( $values['my_field_name'] ) ) {
        wc_add_order_item_meta( $item_id, "My Field", $values['my_field_name'] );
    }
}
add_action( 'woocommerce_add_order_item_meta', 'subscription_order_meta_handler', 1, 3 );

我认为需要更改的是最后一段代码。它当前显示订单项下的文本,所以也许我需要调整wc_add_order_item_meta到别的东西?

我已经尝试了一切,但似乎不起作用。当我的字段位于结帐页面上时,我可以让它工作,但当我从产品页面上拉出它时,它就不行了。

也许我缺少结账流程片段?


2023 年更新 (在 Woocommerce 3+ 中仍然有效)

首先,我已经让一切按预期进行,除了获取值 for my_field_slug在订单页面后端“自定义字段”Metabox 中。

然后在经历了一场真正的噩梦之后,我找到了一个非常好的工作解决方案, 比以前好。在后端,您现在有一个带有自定义字段的自定义元框my_field_slug显示正确的值,如以下屏幕截图所示:


我的代码分为两部分。

  1. The 订单页面中的后端 Metabox,其中一个可编辑字段显示来自产品页面(前端)上的自定义字段的正确值:
// Adding Meta container admin shop_order pages
add_action( 'add_meta_boxes', 'add_shop_order_meta_boxes' );
if ( ! function_exists( 'add_shop_order_meta_boxes' ) )
{
    function add_shop_order_meta_boxes()
    {
        add_meta_box( 'custom_other_field', __('My Field','woocommerce'), 'add_custom_other_field_content', 'shop_order', 'side', 'core' );
    }
}

// Adding Meta field in the meta container on admin shop_order pages
if ( ! function_exists( 'add_custom_other_field_content' ) )
{
    function add_custom_other_field_content( $post )
    {
        $order = wc_get_order($post->ID); // Get the WC_Order object

        printf('<p style="border-bottom:solid 1px #eee;padding-bottom:13px;">
            <input type="hidden" name="custom_other_field_nonce" value="%s">
            <input type="text" style="width:250px;" name="my_field_slug" placeholder="%s" value="%s">
            </p>',
            wp_create_nonce(),
            __('some placeholder text', 'woocommerce'),
            $order->get_meta('_my_field_slug')
        );

    }
}
// Save the Meta field value
add_action( 'woocommerce_process_shop_order_meta', 'save_custom_metabox_field_value', 10, 2 );
if ( ! function_exists( 'save_custom_metabox_field_value' ) )
{
    function save_custom_metabox_field_value( $order_id, $post) {
        // Check if our nonce is set.
        if ( ! isset($_REQUEST['custom_other_field_nonce']) && ! wp_verify_nonce($_REQUEST['custom_other_field_nonce']) ) {
            return $order_id;
        }

        $order = wc_get_order($order_id); // Get the WC_Order object

        // Sanitize text input value and update the meta field in the database.
        $order->update_meta_data('_my_field_slug', sanitize_text_field($_POST['my_field_slug']));
        $order->save();
    }
}

  1. 前端/后端:

Note:我们只允许购物车中包含一件商品,因为产品字段值填充订单 Metabox 字段。

• 产品页面自定义字段(前端)。
• 在购物车、结帐和订单(前端)上显示此数据。电子邮件通知也是如此。
• 在订单页面(后端)显示数据

// Display a text field on single product pages
add_action('woocommerce_before_add_to_cart_button', 'display_custom_field_on_single_product');
function display_custom_field_on_single_product() {
    echo '<div id="my_custom_field">
        <label>' . __( 'My Field') . ' </label>
        <input type="text" name="my_field_slug" value="">
    </div><br>';
}

// Allow only one item in cart
add_filter( 'woocommerce_add_to_cart_validation', 'allow_only_one_cart_item', 10, 3 );
function allow_only_one_cart_item( $passed, $product_id, $quantity ) {
    if( ! WC()->cart->is_empty() ) {
        WC()->cart->empty_cart();
    }
    return $passed;
}

// Store custom field value
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_field_as_custom_cart_item_data', 10, 2 );
function add_custom_field_as_custom_cart_item_data( $cart_item_data, $product_id ) {
    if( isset( $_REQUEST['my_field_slug'] ) ) {
        $cart_item_data[ 'my_field_slug' ] = sanitize_text_field($_REQUEST['my_field_slug']);
        // below statement make sure every add to cart action as unique line item
        $cart_item_data['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}

// Render the field value on cart and checkout
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2 );
function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
    $custom_items = array();

    if( !empty( $cart_data ) ) {
        $custom_items = $cart_data;
    }

    if( isset( $cart_item['my_field_slug'] ) ) {
        $custom_items[] = array( 
            'name'  => __('My Field'), 
            'value' => $cart_item['my_field_slug'] 
        );
    }
    return $custom_items;
}

// Save the the custom field value as order custom meta
add_action( 'woocommerce_checkout_create_order', 'save_custom_field_as_order_meta', 10, 2 );
function save_custom_field_as_order_meta( $order, $data ) {
    $items = WC()->cart->get_cart();
    $item  = reset($items);

    if ( isset($item['my_field_slug']) ) {
        $order->update_meta_data( '_my_field_slug', $item['my_field_slug'] );
    }
}

// Save the the custom field value as order item custom meta
add_action( 'woocommerce_checkout_create_order_line_item', 'save_custom_field_as_order_item_meta', 10, 4 );
function save_custom_field_as_order_item_meta( $item, $cart_item_key, $values, $order ) {
    if ( isset($values['my_field_slug']) ) {
        $item->update_meta_data( 'my_field_slug', $values['my_field_slug'] );
    }
}

 // Add readable "meta key" label name replacement
 add_filter('woocommerce_order_item_display_meta_key', 'filter_wc_order_item_display_meta_key', 10, 3 );
 function filter_wc_order_item_display_meta_key( $display_key, $meta, $item ) {
     if( $display_key === 'my_field_slug' ) {
         $display_key = __('My field', 'woocommerce');
     }
     return $display_key;
 }

现在一切都按预期进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WooCommerce:将自定义 Metabox 添加到管理订单页面 的相关文章

  • 压缩 zend Framework 2 的 html 输出

    我目前正在 PHP 5 4 4 上使用 Zend Framework 2 beta 开发个人 web 应用程序以用于自学目的 我想知道是否可以在 html 输出发送到浏览器之前拦截它 以便通过删除所有不必要的空格来缩小它 我怎样才能在ZF2
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有
  • 私人聊天系统MYSQL查询显示发送者/接收者的最后一条消息

    在这里我延伸一下我之前的问题 私人聊天系统MYSQL查询ORDERBY和GROUPBY https stackoverflow com questions 10929366 private chat system mysql query o
  • 为什么AES java解密返回额外的字符?

    请原谅我英语不好 我使用 mcrypt 我从这里得到它用于 php 和 java 的 MCrypt https snipt net raw ee573b6957b7416f28aa560ead71c3a2 nice 在我的android应用
  • 在 PHP 中将 CSV 写入不带括号的文件

    是否有本机函数或实体类 库用于将数组写入 CSV 文件中的一行而无需封装 fputcsv将默认为 如果没有为封装参数传入任何内容 谷歌让我失望了 返回一大堆有关的页面的结果 fputcsv PEAR 的库做的事情或多或少与fputcsv 工
  • cURL 错误 77:设置证书验证位置时出错:CAfile

    我正在使用 Firebase php SDKlink https firebase php readthedocs io en latest index html并在 Windows 10 上的 XAMPP 服务器上使用 laravel 最
  • 重复使用相同的卷曲手柄。性能大幅提升?

    在 PHP 脚本中 我对不同的 URL 执行了许多不同的curl GET 请求 一百个 将重复使用来自curl init提高性能 还是与请求的响应时间相比可以忽略不计 我这么问是因为在当前的架构中保持相同的句柄并不容易 交叉发布自我应该关闭
  • 使用 PHP 将值插入可编辑 PDF,并保持可编辑状态

    我有一个带有可编辑字段的 PDF 我希望将 HTML 表单中的值传递到此 PDF 中 我尝试过使用 FPDF 并且它有效 但是将值传递到 PDF 后 pdf 中的字段不再可编辑 另一个缺点是 在将值传递到 PDF 时 我们必须为每个字段指定
  • Magento补丁安装失败

    从以下位置下载并运行 Magento PHP 5 4 支持补丁 Magento CE v1 7 0 0 1 7 0 2 时http www magentocommerce com download http www magentocomme
  • 在Wordpress中通过API创建新用户时如何发送电子邮件密码?

    可以使用以下行通过 API 创建新用户 user id wp insert user user data 我想知道如何向新创建的用户发送包含其密码的电子邮件 Wordpress API 中是否有任何函数可以处理这项工作 还是我应该自己创建并
  • Symfony2中如何获取所有post参数? [复制]

    这个问题在这里已经有答案了 我想获取a的所有post参数symfony http symfony com Form I used all parameter this gt get request gt getParameterHolder
  • 使用 PHP 的 Google Glass GDK 身份验证

    我正在尝试点击此链接来验证 GDK 中的用户 https developers google com glass develop gdk authentication https developers google com glass de
  • Android GCM 服务器的 API 密钥

    我有点困惑我应该为 GCM 服务器使用哪个 API 密钥 在文档中它说使用 android api 密钥 这对我不起作用并且总是给出未经授权的 http developer android com google gcm gs html ht
  • 在 Woocommerce 购物车中设置最小小计金额

    我正在尝试将最低订单金额设置为 25 美元 到目前为止 我找到了这段代码 如果未达到最低限度 它似乎可以阻止结账 但它使用的小计包含税费 我需要在总计中排除税费 add action woocommerce checkout process
  • 将数组拆分为特定数量的块

    我知道array chunk 允许将数组拆分为多个块 但块的数量根据元素的数量而变化 我需要的是始终将数组拆分为特定数量的数组 例如 4 个数组 以下代码将数组分为 3 个块 两个块各有 2 个元素 1 个块有 1 个元素 我想要的是将数组
  • 如何在php中使用preg添加html属性

    我正在寻找在 php 中编写一个脚本来扫描 html 文档并根据它找到的内容向元素添加新标记 更具体地说 我是扫描文档并为每个元素搜索CSS标记 float right left 如果找到它 它会添加align right left 基于它
  • php 表单提交 - Q2

    我对这个虚拟问题感到抱歉 这是我的简单 PHP 表单 其中包含两个 SQL 表和 ADD 提交 按钮 我希望将人员从 Test1 转移到 Test2 很多事情都很好 只有提交按钮不起作用 因此 Test2 表没有反馈 Revised 现在提
  • PHP文件上传

    如果我想在文件名转到服务器的永久位置 而不是临时位置 之前更改文件名 我该如何执行此操作 代码如下
  • mysqli bind_param 中的 NULL 是什么类型?

    我正在尝试将参数绑定到 INSERT INTO MySQLi 准备好的语句 如果该变量存在 否则插入 null 然后我知道 type variable i corresponding variable has type integer d
  • PHP 和 NLP:嵌套括号(解析器输出)到数组?

    想要将带有嵌套括号的文本转换为嵌套数组 以下是 NLP 解析器的输出示例 TOP S NP PRP I VP VBP love NP NP DT a JJ big NN bed PP IN of NP NNS roses 原文 我喜欢一大床

随机推荐

  • 如何在 Xcode 4.5“命令行工具”项目中设置工作逻辑单元测试目标?

    无法为特定场景设置单元测试 这就是我正在尝试的 在 Xcode 4 5 中 我创建了一个简单的 OSX 命令行工具 应用项目 基金会 请注意 Xcodedoes not提供自动将单元测试添加到 命令行工具 项目的选项 所以请不要建议勾选复选
  • 用于阻止 Swift 的 Safari 内容的多个过滤器

    我正在构建一个简单的内容阻止应用程序 它有效 但我想应用过滤器 要阻止哪个网站 不阻止哪个网站 UISwitches 保存到NSUserDefaults 因为内容阻止扩展使用 json 所以我不清楚如何选择多个 json 文件同时运行 有什
  • GAE TextProperty 中的“=”符号

    通过 POST 添加文本时 我在文本属性中遇到了奇怪的附加符号 例如 队伍带着不可阻挡的愤怒回来了 他们被警察 阿朗佐和尤马追赶 Vinnie Shorty 和 Kiro 92 的技能将受到考验 该文本中不应有任何 符号 我的代码是 cla
  • 具有自定义网络的 Docker swarm

    我正在尝试弄清楚如何在 Docker 中正确使用 Swarm 模式 首先 我尝试在 2 个工作人员和管理人员计算机上运行容器 而不指定自定义网络 因此我使用默认的入口覆盖网络 但是 如果我使用入口网络 由于某种原因我无法解析tasks my
  • 如何在不同模块中隐藏 Java 中 Kotlin 内部类的可见性?

    我正在研究用 Kotlin 开发的 Android 库 我将某些类的访问修饰符保留为internal 内部类仅在 Kotlin 的该库模块中可见 如果我在应用程序中实现该库 那么它根本不可见 但从 Java 代码访问该库时就会出现问题 如果
  • 如何找出 Vim 设置在哪个插件中被更改?

    今天我有一些奇怪的行为 我有 set autoindent 在我的 vimrc 中 但由于某种原因 每当我打开 PHP 文件时 它就会被关闭 我现在通过添加一行来修复它 autocmd FileType php set autoindent
  • 结合字母顺序和自然顺序(又名用户理智排序)

    我认为这很容易找到预制的 但似乎我在网上找到的任何解决方案都只能解决部分问题 我想对列表进行排序文件名 这些文件大多以人名和 或地址命名 由用户提供 有时使用不同的语言 主要是德语 到处混有一点法语和意大利语 很少有其他西方语言 这个想法是
  • Android Eclipse 插件太慢

    我目前使用的是带有 1 83GHz 处理器和 1 GB RAM 的 Windows 7 机器 我曾经能够使用所有应用程序 没有速度问题 我最近在 Eclipse Helios 中安装了 Android 插件 现在 Eclipse 速度严重减
  • 循环内的侦听器不允许更改外部布尔标志

    继我之前的帖子之后here https stackoverflow com questions 15762311 add a keylistener inside a loop is it possible 我写了一个监听器 Overrid
  • 在 HTML5 和 JavaScript 中使用 Google 地图室内地图 API

    我想使用 HTML5 和 JavaScript 创建一个室内地图应用程序 我创建了一个简单的路线图应用程序 但是当我单击放大任何室内兼容的建筑物 购物中心时 没有级别或地板选项 那么 HTML5 和 Javascript 支持室内功能吗 在
  • 使用 itextsharp 的文本的 x 和 y 坐标

    当我使用 itextsharp 提取文本时 我将获得文本的 x 和 y 坐标 如果我根据 x y 位置将文本从 pdf 转换为 html 则通过使用这 2 个坐标来更改文本位置 获取我使用的 x y 坐标 矢量 curBaseline re
  • 我的班级实例中出现奇怪的内存覆盖问题

    这个问题与this https stackoverflow com questions 6649567 how to check if network shared exe file is used by more than one use
  • 具有 null 安全性的 Flutter / Dart 包integration_test

    据我了解 包集成 测试 https pub dev packages integration test包不是空类型安全的 该包可以用于当前的 Flutter 版本 版本 gt 2 0 吗 如果没有 还有其他选择吗 正如自述文件中所述 该包是
  • SAS LOOP - 从具有值的记录创建列

    假设我有随机诊断代码 例如 001 v58 142 如何从记录中的代码构造列 Input id found code 1 1 001 2 0 v58 3 1 v58 4 1 003 5 0 v58 15000 0 v58 Output id
  • Twilio 在打电话时说动词

    基于这个问题 https stackoverflow com questions 6863305 twilio say verb nested into a dial verb 它非常接近我想要的 当双方建立连接时 我们尝试在通话期间触发
  • 从 Apache Velocity 模板访问常量值?

    是否可以从 Velocity 模板访问常量值 即 Java 类中定义的公共静态最终变量 我希望能够写出这样的东西 if a lt Long MAX VALUE 但这显然不是正确的语法 有很多种方法 1 您可以将值直接放入上下文中 2 您可以
  • 如何优化 MySQL 更新查询?

    我有一个包含 300 000 条记录的表 在此表中有重复的行 我想更新列 flag TABLE number flag more column ABCD 0 ABCD 0 ABCD 0 BCDE 0 BCDE 0 我使用此查询
  • 限制 Django 模型中的递归外键深度

    我有一个 Django 模型 其中 self 的外键可为空 我有兴趣对递归深度引入硬限制 例如 10 哪里是检查这个的正确位置以及我应该在那里抛出什么样的异常 我的意思的伪示例 def limit recursion depth self
  • Apache mod_rewrite 未将表达式映射到参数

    我有一个网站使用apache mod rewrite并且在过去 6 个月里一直工作 没有出现任何错误 我有以下重写规则 RewriteRule products a z products php category 1 NC L 这是我页面中
  • WooCommerce:将自定义 Metabox 添加到管理订单页面

    我目前已成功向我的 WooCommerce 产品页面添加一个字段 该字段显示值 在购物车 前端 中 在结账页面 前端 在订单页面 前端 并在管理个人订单页面 后端 中 问题 它没有在管理订单 自定义字段 Metabox 中显示为自定义字段及