在 Woocommerce 中保存并显示订单项自定义元数据

2023-12-26

我有一些自定义代码工作得很好,自从我将 Woocommerce 更新到版本 3.5.2 后,它就不再工作了,不确定是因为我更改了 WordPress 主题还是因为插件更新了。

我的问题是自定义字段的值不会出现在 woocommerce 的订单页面上,甚至不会出现在订单电子邮件上。

这是相关代码:

// Display Fields using WooCommerce Action Hook
 add_action('woocommerce_product_options_general_product_data', 'woocom_general_product_data_custom_field');
function woocom_general_product_data_custom_field()
{
    // FieldName1
    woocommerce_wp_text_input(array('id' => 'FieldName1', 'label' => __('FieldName1', 'woocommerce'), 'placeholder' => '', 'desc_tip' => 'false', 'description' => __('', 'woocommerce')));

    // FieldType1
    woocommerce_wp_text_input(array('id' => 'FieldType1', 'label' => __('FieldType1', 'woocommerce'), 'placeholder' => '', 'desc_tip' => 'false', 'description' => __('', 'woocommerce')));

    // FieldLenght1
    woocommerce_wp_text_input(array('id' => 'FieldLenght1', 'label' => __('FieldLenght1', 'woocommerce'), 'placeholder' => '', 'desc_tip' => 'false', 'description' => __('', 'woocommerce')));

    // Dropdown1
    woocommerce_wp_text_input(array('id' => 'Dropdown1', 'label' => __('Dropdown1', 'woocommerce'), 'placeholder' => '', 'desc_tip' => 'false', 'description' => __('', 'woocommerce')));       
}

// Hook to save the data value from the custom fields
add_action('woocommerce_process_product_meta', 'woocom_save_general_proddata_custom_field');
function woocom_save_general_proddata_custom_field($post_id)
{
    // Save Label Option 1
    update_post_meta($post_id, 'FieldName1', esc_attr($_POST['FieldName1']));

     // Save Label Option 1
    update_post_meta($post_id, 'FieldType1', esc_attr($_POST['FieldType1']));

    // Save Label Option 1
    update_post_meta($post_id, 'FieldLenght1', esc_attr($_POST['FieldLenght1']));

    // Save Dropdown1
    update_post_meta($post_id, 'Dropdown1', esc_attr($_POST['Dropdown1']));
}

/**
 * Register the 'Custom Column' column in the importer.
 *
 * @param array $options
 * @return array $options
 */
function add_column_to_importer($options)
{

    // column slug => column name
    $options['FieldName1'] = 'FieldName1';
    $options['FieldType1'] = 'FieldType1';
    $options['FieldLenght1'] = 'FieldLenght1';
    $options['Dropdown1'] = 'Dropdown1';

    return $options;
}
add_filter('woocommerce_csv_product_import_mapping_options', 'add_column_to_importer');

/**
 * Process the data read from the CSV file.
 * This just saves the value in meta data, but you can do anything you want here with the data.
 *
 * @param WC_Product $object - Product being imported or updated.
 * @param array $data - CSV data read for the product.
 * @return WC_Product $object
 */
function process_import( $object, $data ) {


    if ( ! empty( $data['FieldName1'] ) ) {
        $object->update_meta_data( 'FieldName1', $data['FieldName1'] );
    }
    if ( ! empty( $data['FieldType1'] ) ) {
        $object->update_meta_data( 'FieldType1', $data['FieldType1'] );
    }
    if ( ! empty( $data['FieldLenght1'] ) ) {
        $object->update_meta_data( 'FieldLenght1', $data['FieldLenght1'] );
    }
    if ( ! empty( $data['Dropdown1'] ) ) {
        $object->update_meta_data( 'Dropdown1', $data['Dropdown1'] );
    }

    return $object;
}
add_filter( 'woocommerce_product_import_pre_insert_product_object', 'process_import', 10, 2 );

// Add the field to the product
add_action('woocommerce_before_add_to_cart_button', 'my_custom_checkout_field');
function my_custom_checkout_field() {
    global $product;

    $product_id = $product->get_id();

    // Get the field name of InputText1
    $FieldType1 = get_post_meta($product_id, 'FieldType1', true);
    $FieldName1 = get_post_meta($product_id, 'FieldName1', true);
    $FieldLenght1 = get_post_meta($product_id, 'FieldLenght1', true);
    $Dropdown1 = get_post_meta($product_id, 'Dropdown1', true);
    $Dropdown1Content = explode(", ", $Dropdown1);

    echo '<table class="extravariations" cellspacing="0">
                        <tbody>';
    // Field 1

    if( ! empty( $FieldType1 ) ){
        if( $FieldType1 == "TEXT AREA"){

            echo '

                    <tr>
                        <td class="label">
                            <label for="'.$FieldName1.'" id="label1">'.$FieldName1.':</label><br> 
                        </td>
                        <td class="value">
                            <textarea id="'.$FieldName1.'" class="inputfield1" name="FieldTypeValue1" maxlength="'.$FieldLenght1.'" rows="2" cols="80" placeholder="" required></textarea>
                        </td>                       
                    </tr>';
        }

        if( $FieldType1 == "TEXT BOX"){
        echo '<tr>
                        <td class="label">
                            <label for="'.$FieldName1.'" id="label1">'.$FieldName1.':</label>
                        </td>
                        <td class="value">
                            <input  id="'.$FieldName1.'" class="inputfield1" type="text"  maxlength="'.$FieldLenght1.'" name="FieldTypeValue1" value="" required>
                        </td>                       
                    </tr>';
        }


        if( $FieldType1 == "DROP DOWN"){


             echo ' <tr>
                            <td class="label">
                                <label for="'.$FieldName1.'" id="label1">'.$FieldName1.':</label>
                            </td>
                            <td class="value">';
            echo'<select id="'.$FieldName1.'" class="inputfield1"             name="FieldTypeValue1" >';
                                foreach ($Dropdown1Content as $Dropdown1IndividualContent) {
                                echo '<option     value="'.$Dropdown1IndividualContent.'">';
                                echo $Dropdown1IndividualContent;
                                echo '</option>';
                                }
            echo'</td></tr>';

        }

    }

    echo'               </tbody>
            </table>';
}

// Store custom field label and value in cart item data
add_action( 'woocommerce_add_cart_item_data','save_my_custom_checkout_field', 20, 2 );
function save_my_custom_checkout_field( $cart_item_data, $product_id ) {
    $label1 = get_post_meta( $product_id, 'FieldName1', true );

    if( isset( $_REQUEST['FieldTypeValue1'] ) && ! empty( $label1 ) )
        $cart_item_data['custom_data']['1'] = array(
            'label' => $label1,
            'value' => sanitize_text_field( $_REQUEST['FieldTypeValue1'] ),
        );


    if( count($cart_item_data['custom_data']) > 0 )
        $cart_item_data['custom_data']['key'] = md5( microtime().rand() );

    return $cart_item_data;
}


// Display items custom fields label and value in cart and checkout pages
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 20, 2 );
function render_meta_on_cart_and_checkout( $cart_data, $cart_item ){
    $custom_items = array();

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

    if( isset( $cart_item['custom_data'] ) ) {
        foreach( $cart_item['custom_data'] as $key => $custom_data ){
            if( $key != 'key' ){
                $custom_items[] = array(
                    'name' => $custom_data['label'],
                    'value' => $custom_data['value'],
                );
            }
        }

    }
    return $custom_items;
}

// Save item custom fields label and value as order item meta data
add_action('woocommerce_add_order_item_meta','save_in_order_item_meta', 10, 3 );
function save_in_order_item_meta( $item_id, $values, $cart_item_key ) {
    if( isset( $values['custom_data'] ) ) {
        wc_add_order_item_meta( $item_id, $values['custom_data']['label'], $values['custom_data']['value'] );
    }
}

我已经寻找了几个小时,但我不知道如何解决它或问题是什么。任何帮助或提示都会非常有帮助。多谢。


第一个主要问题是$cart_item_data['custom_data']['1'] = array(那应该是:

$cart_item_data['custom_data'] = array(
    'label' => $label1,
    'value' => sanitize_text_field( $_REQUEST['FieldTypeValue1'] ),
);

那么第二个主要问题是最后一个函数,其中woocommerce_get_item_data已过时并被替换woocommerce_checkout_create_order_line_item已经回答了在你的最后一个问题中 https://stackoverflow.com/questions/53697569/problem-with-woocommerce-add-order-item-meta.

因此,下面我重新审视了您的最后 3 个功能:

// Store custom field label and value in cart item data
add_action( 'woocommerce_add_cart_item_data','add_custom_data_as_custom_cart_item_data', 10, 3 );
function add_custom_data_as_custom_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
    if( isset( $_REQUEST['FieldTypeValue1'] ) ) {

        // Get an instance of the WC_Product object
        $product = wc_get_product( $variation_id > 0 ? $variation_id : $product_id );

        if( $label = $product->get_meta('FieldName1') ){
            $cart_item_data['custom_data'] = array(
                'label' => $product->get_meta('FieldName1'),
                'value' => sanitize_text_field( $_REQUEST['FieldTypeValue1'] ),
                'unique_key' => md5( microtime().rand() ),
            );
        }
    }
    return $cart_item_data;
}

// Display cart item custom data in cart and checkout pages
add_filter( 'woocommerce_get_item_data', 'display_cart_item_custom_on_cart_and_checkout', 10, 2 );
function display_cart_item_custom_on_cart_and_checkout( $cart_item_data, $cart_item ){
    if( isset($cart_item['custom_data']['label']) && isset($cart_item['custom_data']['value']) ) {
        $cart_item_data[] = array(
            'name' => $cart_item['custom_data']['label'],
            'value' => $cart_item['custom_data']['value'],
        );
    }
    return $cart_item_data;
}

// Save cart item custom data as order item meta data and display it everywhere in Orders and email notifications
add_action('woocommerce_checkout_create_order_line_item', 'save_custom_order_item_meta_data', 10, 4 );
function save_custom_order_item_meta_data( $item, $cart_item_key, $values, $order ) {
    if( isset( $values['custom_data']['label'] ) && isset( $values['custom_data']['value'] ) ) {
       $item->update_meta_data( $values['custom_data']['label'], $values['custom_data']['value'] );
    }
}

代码位于活动子主题(或活动主题)的 function.php 文件中。经过测试并工作。

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

在 Woocommerce 中保存并显示订单项自定义元数据 的相关文章

  • PHP 或 WAMP 不确定是什么

    我已经安装了 WAMP 服务器 2 0 PHP 5 4 3 安装WAMP后我已经重新启动了所有服务并且可以打开 phpinfo 显示良好 phpmyadmin 它也显示得很好 我可以使用数据库 然而 当在 Chrome 中运行简单的 php
  • PHP 开发相当于 Mongrel/Webrick 吗?

    PHP 开发中是否有与 Rails 开发期间使用 Mongrel Webrick 等效的方法 我通常在端口 3000 上使用 Mongrel 在开发过程中为我的 Rails 应用程序提供服务 我从事 PHP 开发已经有几年了 据我所知 方法
  • 如何将 HTML 转换为 Markdown?

    我有一个类似 stackoverflow 的网站 有一个文本区域 人们可以在其中写答案 我用这个 PHP 库 http parsedown org 转换降价 我的意思是我使用该函数来转换 italic to i italic i inclu
  • 使用 php 在多维数组中按键排序[重复]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中对多维数组进行排序 https stackoverflow com questions 2059255 sorting multidimensional array in php 如何在
  • 限制自己超载外部 API 的速率

    我发现了很多信息和脚本示例 展示了如何对 API 用户进行速率限制 但我无法找到任何示例来说明在施加这些限制时如何对您自己的 API 请求进行速率限制 我总是用诸如以下的代码来限制我的脚本sleep or usleep命令 但感觉这是一种低
  • 如何解码 eval( gzinflate( base64_decode(

    我已将此代码注入到我的网站中 如何解码尾随字符串 我需要知道发生了什么以及其背后的代码是什么 这应该输出将被执行的代码eval 我希望这就是您正在寻找的
  • Laravel 5 中的自定义验证器

    我正在将 Laravel 应用程序从 4 升级到 5 但是 我有一个自定义验证器 但无法运行 在L4中 我做了一个验证器 php文件并将其包含在全局 php using require app path validators php 我尝试
  • WordPress 分页自定义帖子类型

    我有一个名为 新闻 的页面 使用页面模板page newslist php 它应该显示来自自定义帖子类型 也称为新闻 的帖子 我意识到两者具有相同的名称会导致问题 因此在注册自定义帖子类型时 我进行了重写以将其与页面区分开来 rewrite
  • 使用php将数据存储到文本文件中?

    我正在尝试将数据存储在文本文件中 例如使用 php 将数组存储到文本文件中 而不是存储到 mysql 数据库中 例如 这里是要存储在文本文件中的数据 name gt john age gt 25 location gt australia
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • 自动建议 php 的 ajax

    我有一个 html 表单 php 脚本和 jquery 我需要一个 ajax 代码来从我的 php 脚本中进行自动建议 以下是代码 表单 html
  • phpunit测试调用其他需要mock的类方法的方法

    我正在尝试创建一个非常标准的单元测试 在其中调用一个方法并断言它的响应 但是我正在测试的方法调用同一类中的另一个方法 该方法做了一些繁重的工作 我想模拟该方法 但仍按原样执行我正在测试的方法 仅使用从调用另一种方法返回的模拟值 我简化了示例
  • Sonata DateTimePickerType 类默认日期显示错误的日期时间格式

    我陷入困境 我不知道如何使用 sonata DateTimePickerType 类正确设置默认日期和时间 我尝试了不同的方法 但到目前为止 没有一种方法没有帮助 在下面的截图中 help 键显示正确的日期和时间 但是当我使用 dp 默认日
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • php curl 使用 GET 发送变量 奇怪的结果

    我正在尝试调用远程站点上页面中的网址 决定使用curl 在远程站点上 url 变量显示为 REQUEST Array var1 gt val1 amp var2 gt val2 amp var3 gt val3 被调用的url是 http
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入

随机推荐

  • System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键

    对方法执行单元测试时 我收到上述错误消息 我知道问题出在哪里 只是不知道为什么字典中没有它 这是字典 var nmDict xelem Descendants plantNS Month ToDictionary k gt new Tupl
  • 有人可以向我解释一下匿名方法吗?

    Delphi 2009 中还有一些很酷的东西 其中之一就是新增了匿名方法 我已经看过有关匿名方法的示例和博客文章 但我还没有明白 有人能解释一下为什么我应该感到兴奋吗 请看一下closures http en wikipedia org w
  • Android Drawable:在 XML 文件中以百分比形式指定形状宽度?

    我正在尝试创建一个简单的 Drawable 我想将其设置为视图的背景 使用设置背景Drawable 我只是想将可绘制的背景分成两个相等的矩形 50 50 第一个要填充黑色 第二个要填充白色
  • 使用 cplex 在 java 中定义二元决策变量

    我正在尝试使用 cplex 在 java 中定义二元决策变量 这是一个二维变量 这意味着如果一条路径从特定站点开始 则它应该为 1 否则为 0 我有一组站点 J 和一组路径 K 我的决策变量是 Z jk 目前我正在定义如下代码 但它不起作用
  • Perl chdir 不起作用

    之前的一篇文章可能有用 Perl system 调用失败 返回代码 65280 https stackoverflow com questions 11989196 perl system call failed with return c
  • 如何在 NativeScript 中访问 Google Play 服务

    我目前正在从 NativeScript 开始 我正在尝试将某些 Google Play 服务包含到 android 项目中 我将相关的 aar 文件放入我的应用程序项目的 node modules 文件夹中并构建它 我可以看到它们已成功添加
  • 将 mongo 中的大写字母更改为驼峰式大小写?

    我有一个名为 User 的集合 其中包含字段 FirstName 和 SecondName 但数据是大写字母 firstName FIDO secondName JOHN 我想知道是否可以将字段制作成骆驼箱 firstName Fido s
  • 打印 `awk` 中的倒数第二列/字段

    我想打印倒数第二列或字段awk 字段的数量是NF多变的 我知道我应该能够使用 NF 但我不确定如何使用它 这似乎不起作用 awk print NF awk print NF 1 应该管用
  • 使用 SQL*Loader 更新表中的列

    我编写了一个具有以下查询的 SQL 脚本 查询工作正常 update partner set is seller buyer 1 where id in select id from partner where names in A B C
  • 将字母转换为数字

    我想将字母 A 更改为点 1 将字母 Z 更改为数字 26 然后再次更改为数字 27 字母 AA AB 更改为 28 我该怎么办 我必须使用 开关 吗 我使用java程序 没有对此进行测试 但按照这些思路应该可以工作 public Stri
  • 在 Play 2.0 中设置自定义根 URL

    我有一个 play 应用程序 如果它是 Web 主机的根目录 则可以运行 但是我想将其作为主机的子 URL 加载 That is http example com lt This works fine and i want to move
  • 求助......串口编程

    我想用 python 与我的串口进行通信 我为linux安装了pyserial和uspp 尽管如此 当我运行以下代码时 import serial ser serial Serial dev pts 1 19200 timeout 1 pr
  • 如何改变CSS中的删除线/穿线粗细?

    我正在使用text decoration line through在 CSS 中 但我似乎找不到任何方法来改变线条粗细 而不需要像 hr 或图像叠加 有没有优雅的方法来指定穿线的粗细 现代的解决方案是使用文字装饰厚度 https devel
  • 在 MAMP 上安装 PEAR

    我正在使用 MAMP 进行开发 我一直无法让 PEAR 工作 MAMP 文档和论坛似乎没有答案 在MAMP论坛上提问的人似乎都没有回复 以前我在 MAMP 上开发了系统 并且只使用 PEAR 来处理邮件 所以我让它在服务器上运行一次 而不是
  • 浏览器 JavaScript 是否允许 SIMD 或矢量化操作?

    我想用 JavaScript 编写需要大量数值计算的应用程序 然而 我对客户端 JavaScript 中类似线性代数的高效计算的状态感到非常困惑 似乎有很多方法 但没有明确表明它们已准备就绪 其中大多数似乎对允许计算的向量和矩阵的大小有限制
  • 将变量保存在文本文件中

    我想将变量 包括其值 保存到文本文件中 以便下次打开程序时 任何更改都会自动保存到文本文件中 例如 balance total savings total expenses 我将如何将变量本身保存到文本文件中 而不仅仅是其值 此部分用于注册
  • 如何将 JPEG 图像转换为具有透明背景的 PNG 图像?

    我有一个 JPEG 格式的图像 带有白色背景和黑色圆圈 如何将此图像转换为 PNG 格式 使白色背景透明 黑色保留在那里 我也是一名程序员 如果 C 代码中有一些想法我会很高兴 我也在寻找转换器 工具 程序等任何东西 谢谢 Jeff 这是可
  • 如何将 Visual Studio 2005 的平台工具集添加到较新 IDE 版本的“平台工具集”列表中?

    我已经安装了 Visual Studio 2005 2015 我要使用 Visual Studio 2005 的平台工具集 但列表中没有这个变体 如何将Visual Studio 2005的平台工具集添加到Platform Toolset较
  • 如何在 Spark 中将 RowMatrix 更改为数组或将其导出为 CSV?

    我在 Scala 中有这样的代码 val mat CoordinateMatrix new CoordinateMatrix data val rowMatrix RowMatrix mat toRowMatrix val svd Sing
  • 在 Woocommerce 中保存并显示订单项自定义元数据

    我有一些自定义代码工作得很好 自从我将 Woocommerce 更新到版本 3 5 2 后 它就不再工作了 不确定是因为我更改了 WordPress 主题还是因为插件更新了 我的问题是自定义字段的值不会出现在 woocommerce 的订单