Php 在Woocommerce 3中添加自定义签出字段作为订单自定义元数据

Php 在Woocommerce 3中添加自定义签出字段作为订单自定义元数据,php,wordpress,woocommerce,hook-woocommerce,orders,Php,Wordpress,Woocommerce,Hook Woocommerce,Orders,在WooCommerce 3.0发布之前,我的代码非常有效,可以在结账时将定制值从购物车保存到订单中。但从那时起,我就无法为订单创建自定义元 环境:Wordpress 4.9.4和WooCommerce 3.3.3 钩子 add_action('woocommerce_checkout_update_order_meta','custom_meta_to_order',20,1) add_action('woocommerce_checkout_create_order','custom_met

WooCommerce 3.0发布之前,我的代码非常有效,可以在结账时将定制值从购物车保存到订单中。但从那时起,我就无法为订单创建自定义元

环境:Wordpress 4.9.4和WooCommerce 3.3.3

钩子
  • add_action('woocommerce_checkout_update_order_meta','custom_meta_to_order',20,1)
  • add_action('woocommerce_checkout_create_order','custom_meta_to_order',20,1)
  • 1号钩子是我尝试得最多的一个,2号钩子只是一个文字实验

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

    我还检查了mySQL表中的
    表wp\u woocommerce\u order\u itemmeta
    是否至少会创建两个\u TESTKEY*-meta条目(因为它们没有条件)

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

    所以我的问题是:“我做错了什么?”更新:您的代码中有一些错误

    • 两个钩子只有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) 对我来说,最好的方法是:

    代码进入活动子主题(或主题)的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中测试+


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

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



    相关:

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

    • 两个钩子只有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) 对我来说,最好的方法是:

    代码进入活动子主题(或主题)的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中测试+


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

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



    相关:

    因为评论很难阅读(因为格式限制太多),所以这个答案只是对问题的回应。

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

    首先是我们的误解

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

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

    推荐方法起初不起作用

    你建议的推荐方式都不起作用。我还把它们剥离得太多,以至于它们应该可以工作,只需在meta中写入一些内容。我不知道这次是哪个插件/主题函数搞坏了我

    但是我能够解决这个问题

    还有更多!只是因为我发现了我过去发现的地方,如何做到这一点,除了我个人的运气之外,作者已经写了与这个过程相关的

    还是你的帖子帮助了我

    从那以后,你给我看的错误一直困扰着我,因为很难用Sublime和CodeIntel(以及我从Symfony开始的时候)跟踪和检查每件事,我决定购买PHPStorm,它显示并允许我通过正确更新来修复所有不推荐的(遗留的)函数

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

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


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

    因为评论确实很难阅读(因为它的格式非常有限),所以这个答案只是对问题的回应。

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

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