当前位置: 首页 > 知识库问答 >
问题:

在WooCommerce 3中添加自定义结帐字段作为订购自定义元数据

叶国兴
2023-03-14

在WooCommerce 3.0发布之前,我的代码已经像魔法一样工作,将自定义值从购物车保存到结账时的订单中。但从那以后,我无法为订单创建自定义元。

环境:WordPress4.9。4.

  1. add_action('woocommerce_checkout_update_order_meta','custom_meta_to_order',20,1)

1号钩子是我尝试得最多的钩子,2号钩子只是本主题中提到的一些文字变化的实验。

以下功能代码与钩号1有关:

if (!function_exists('custom_meta_to_order')) {
    function custom_meta_to_order($order_id, $values) {
        $order = wc_get_order( $order_id );

        $order->update_meta_data('_TESTKEYstart', 'Hello');

        if (isset($values['myValue'])) {
            $myValue = $values['myValue'];
            if (!empty($myValue)) $order->update_meta_data('_myKey', $myValue);
        }

        $order->update_meta_data('_TESTKEYend', 'Bye');

        $order->save();
    }
}

我还检查了mySQL表wp_woocommerce_order_itemmeta是否至少会创建两个_TESTKEY*-元入口(因为它们没有条件)。

  • 但是看起来元键和值并不是通过这个钩子和函数创建的
  • 函数本身正在被调用,因此至少钩子本身正在工作

共有2个答案

长孙弘盛
2023-03-14

因为注释真的很难阅读(因为格式非常有限),所以这个答案只是对LoicTheAztec答案的回应。

我写了一个较长的答案,但它似乎已经不见了,所以我现在很抱歉写了一个较短的答案!

首先是我们的误解

您知道我想使用产品的自定义值,但在我的情况下,它有点不同。我写了一个外部应用程序,其中包括wp-load.php,然后将数据发布回产品页面到购物车中。

所以这里出现的问题是试图在结账时将购物车中的数据写入订单。

推荐方式一开始并不奏效

你建议的推荐方式都不起作用。我还把它们剥离了很多,以至于它们应该工作,只是在元数据中写些东西。我不知道这一次是哪个插件/主题功能戏弄了我。

但我能解决问题

等等!仅仅因为我找到了我在过去发现的博客文章,如何做到这一点,作为我个人的运气,作者已经为WP3.0写了与这个过程相关的变化。

还是你的帖子帮了我

从那以后,你给我看的错误一直困扰着我,因为很难用Sublime和CodeIntel(以及我从Symfony开始)来跟踪和检查一切,所以我决定购买PHPStorm,它显示并允许我修复我所有不建议使用的(遗留使用的)功能通过正确更新它们。

(最后,不再有全局变量:耶。)

我的意思是,内联显示参数和弃用笔划已经做得很好了。但是一个没有bug的工作代码intel/reference在大型项目中不会消亡,这真是太棒了。

这就是为什么我把你的答案标记为解决方案,谢谢。否则我可能会解决这个问题(多亏了作者的博客文章),但仍然会坐在一个滴答作响的定时炸弹上。

万俟招
2023-03-14

更新:您的代码中有一些错误…

  • 两个钩子都只有1个参数(不是2个,所以$values不存在)
  • 要获取自定义字段,您应该使用$\u POST['myValue']
  • 还有其他一些东西,比如每个钩子都有不同的参数:
    • $order\u id用于woocommerce\u checkout\u update\u order\u meta
    • $order用于woocommerce\u checkout\u create\u order

    下面我已将$\u POST['myValue']替换为$\u POST['billing\u country'],因为您没有给出此自定义签出字段的代码…

    所以这里有两种方法:

    1) 对我来说,最好的方法是:

    if ( ! function_exists('custom_meta_to_order') ) {
        add_action( 'woocommerce_checkout_create_order', 'custom_meta_to_order', 20, 1 );
        function custom_meta_to_order( $order ) {
    
            $order->update_meta_data('_TESTKEYstart', 'Hello');
    
            if (isset($_POST['billing_country'])) {
                $myValue = $_POST['billing_country'];
                if (!empty($myValue)) $order->update_meta_data('_my_key', $myValue);
            }
    
            $order->update_meta_data('_TESTKEYend', 'Bye');
        }
    }
    

    代码function.php活动子主题(或主题)的文件中。测试和工作。

    2) 另一方面:

    if ( ! function_exists('custom_meta_to_order') ) {
        add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);
        function custom_meta_to_order( $order_id ) {
            // get an instance of the WC_Order object
            $order = wc_get_order( $order_id );
    
            $order->update_meta_data('_TESTKEYstart', 'Hello');
    
            if (isset($_POST['billing_country'])) {
                $myValue = $_POST['billing_country'];
                if (!empty($myValue)) $order->update_meta_data('_my_key', $myValue);
            }
    
            $order->update_meta_data('_TESTKEYend', 'Bye');
    
            // Save the order data and meta data
            $order->save();
        }
    }
    

    代码function.php活动子主题(或主题)的文件中。测试和工作。

    证据:

    和(此订单ID的数据库wp_postmeta表中):

    在WooCommerce版本3.3中测试

    您也可以使用旧方法(有效):

    if ( ! function_exists('custom_meta_to_order') ) {
        add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);
        function custom_meta_to_order( $order_id ) {
    
            update_post_meta( $order_id, '_TESTKEYstart', 'Hello' );
    
            if ( isset( $_POST['billing_country'] ) ) {
                $myValue = $_POST['billing_country'];
                if (!empty($myValue)) 
                    update_post_meta( $order_id, '_my_key', $myValue);
            }
    
            update_post_meta( $order_id, '_TESTKEYend', 'Bye');
        }
    }
    

    代码function.php活动子主题(或主题)的文件中。测试和工作。

    相关:为Woocommerce中的订单添加额外的元数据

 类似资料:
  • 我正试图在结帐时将定制费用计入订单总额。我在woocommerce中添加了一个复选框 包含一个自定义js文件,可用于处理事件 和一个php费用处理函数 由于某些原因,$_POST['state']的值没有被添加,当我给出一个硬编码值时,函数会工作,我尝试了很多选项,但无法让它工作。 我看过类似的帖子,但没有一个有答案。

  • 我使用的是一个自定义的帖子类型和集成的woocommerce,我可以在页面上添加一个AddtoCart按钮,并可以将其添加到cart,所以效果很好 这是我的密码 但现在我需要在产品页面上添加一些自定义字段,一个包含颜色“黑色”和“白色”的下拉列表,这只是一个普通的下拉列表。当我选择一个将在购物车上显示在产品名称下的值时,我该怎么做

  • WordPress-WooCommerce 我想做的是: null 邮件里什么也没印。 请解决。提前谢了。

  • 我正在为一个自定义的woocommerce结帐表单的多选字段而挣扎。 我通过函数创建了自定义multislect字段: 请注意,woocommerce函数无法创建自定义多选字段,因此这里有一个简单的选择字段。 我决定使用jQuery以这种方式添加多个缺失的属性: 现在我有了multiselect字段,它看起来像: 问题是,顺序元值没有正确更新,它每次只显示一个值,而不是一个数组的值,如果人选择一个

  • 使用以下代码,我可以在WooCommerce产品上获得一个自定义字段,但是如何在订单、结帐和管理订单(后端)上显示它呢? 这是我在每个产品上的自定义字段 这是我的管理订单(后端)详细信息。我尝试显示我在每个产品帖子中输入的正确元数据。 如何在管理订单中显示我在自定义字段中输入的值?我也希望有人能帮助我显示在订单和结帐页面的元。。。或者引导我走向正确的方向。我意识到,为了在管理订单中显示它,我必须确