在 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 用星号替换所有字符

    假设我有一个字符串形式的密码 password thisisaplaintextpassword 我怎样才能把它变成下面的样子 password 我想通过电子邮件向用户发送他们的帐户详细信息 但不想发送整个内容 Use 字符串重复 http
  • PHP 文件上传帮助

    div align center div 这是我的代码
  • 使用 md5 加密的 PHP 和 Mysql 查询出现问题

    我使用普通的 php mysql 插入查询并使用 md5 加密密码 这是插入查询 sql mysql query INSERT INTO user username password role approved values usernam
  • php表格:每行显示3个单元格[重复]

    这个问题在这里已经有答案了 我看这里 数组放入每行 5 个单元格的表格中 https stackoverflow com questions 9099568 array into a table with 5 cells in each r
  • PHP解析xml文件错误

    我正在尝试使用 simpleXML 来获取数据http rates fxcm com RatesXML http rates fxcm com RatesXML Using simplexml load file 我有时会遇到错误 因为这个
  • 覆盖供应商自动加载编辑器

    有没有办法让您创建的自动加载文件在调用供应商自动加载之前运行 我们似乎遇到了 SimpleSAML 的自动加载覆盖我们创建的自动加载文件之一的问题 我是 Composer 的新手 似乎无法在网上找到任何解决方案 我尝试将我们的自动加载文件包
  • 使用 PHP 对 ASP.NET 成员身份中的用户进行身份验证

    我在尝试使用 PHP 针对现有 ASP NET 成员资格数据库对用户进行身份验证时遇到一些问题 我在网上搜索过 发现现有的答案似乎对我不起作用 即 public static function Hash password salt deco
  • 运行 Composer 返回:“无法打开输入文件:composer.phar”

    我是 symfony2 和阅读新手symblog http tutorial symblog co uk tutorial parts 在第三章中 在尝试使用数据装置时 我尝试了以下命令 php composer phar update 但
  • 如何将 PHPMailer 与 Codeigniter 3 集成

    嗨 我正在尝试使用PHPMailer 库 https github com PHPMailer PHPMailer来自我的 Codeigniter 应用程序中的 GitHub 我下载了代码并解压到我的application library文
  • Magento补丁安装失败

    从以下位置下载并运行 Magento PHP 5 4 支持补丁 Magento CE v1 7 0 0 1 7 0 2 时http www magentocommerce com download http www magentocomme
  • 如何将 mysql 转换为 mysqli? [复制]

    这个问题在这里已经有答案了 我厌倦了将 mysql 转换为 mysqli 但似乎收到了很多错误和警告 连接到数据库没有问题 但其余代码似乎错误 我做错了什么 sql
  • Laravel 按动态 ID 数组对集合进行排序 [重复]

    这个问题在这里已经有答案了 我有以下 people array 5 2 9 6 11 people collection People find people 但当我倾倒并死去时 people collection集合按 ID ASC 排序
  • Android GCM 服务器的 API 密钥

    我有点困惑我应该为 GCM 服务器使用哪个 API 密钥 在文档中它说使用 android api 密钥 这对我不起作用并且总是给出未经授权的 http developer android com google gcm gs html ht
  • 如何编写在正文中包含锚标记的 Zend Framework URL?

    使用 Zend Framework 中设置的标准 MVC 我希望能够显示始终具有锚点的页面 现在我只是在 phtml 文件中添加一个带有 anchor 的无意义参数
  • 使用 DOJO 自动完成文本框

    我正在寻找一种使用 DOJO 进行文本框自动建议的简单方法 我将查询的数据库表 使用 PHP 脚本 以 JSON 形式返回 有超过 100 000 条记录 因此这确实不应该采用 FilteringSelect 或 ComboBox 的形式
  • 如何从字符串中删除所有数字?

    我想删除字符串 0 9 中的所有数字 我写了这段有效的代码 words preg replace 0 words remove numbers words preg replace 1 words remove numbers words
  • php下拉菜单人口

    我正在尝试编写一个 php 脚本 该脚本将根据主下拉菜单的选择填充第二个下拉菜单 我想使用 jquery 来完成所有非页面刷新的事情 但我发现现有的所有东西都很难理解和修改 你知道有什么写得很好且易于理解的东西吗 或者可能是现有的教程 下面
  • 如何在 codeigniter 查询中使用 FIND_IN_SET?

    array array classesID gt 6 this gt db gt select gt from this gt table name gt where array gt order by this gt order by q
  • 为什么 PHP 中不允许“传统”类型提示?

    刚刚发现类型提示 http php net manual en language oop5 typehinting phpPHP 中允许 但不适用于整数 字符串 布尔值或浮点数 为什么 PHP 不允许对整数 字符串等类型进行类型提示 从 P
  • 检查文件权限

    我怎样才能检查file permissions 无需通过运行操作系统特定命令passthru or exec Use 文件权限 http php net fileperms功能 clearstatcache echo substr spri

随机推荐

  • 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 的订单