【问题标题】:Add custom checkout field as Order custom-meta data in Woocommerce 3在 Woocommerce 3 中添加自定义结帐字段作为订单自定义元数据
【发布时间】:2018-08-07 17:22:27
【问题描述】:

WooCommerce 3.0 出现之前,我的代码就像一种魅力,可以将购物车中的自定义值保存到结帐时的订单中。但从那以后,我无法为订单创建自定义元数据。

环境: Wordpress 4.9.4 和 WooCommerce 3.3.3

挂钩

  1. add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);
  2. add_action('woocommerce_checkout_create_order', 'custom_meta_to_order', 20, 1);

第 1 个 Hook 是我尝试最多的一个,第 2 个只是对一些文字 changes mentioned in this topic 的实验。

功能

以下函数代码与钩号 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 表 table wp_woocommerce_order_itemmeta 是否至少会创建两个 _TESTKEY*-元条目(因为它们没有条件)。

  • 但元键和值似乎不是通过这个钩子和函数创建的。
  • 函数本身被调用,所以至少钩子本身在工作。

所以我的问题是:“我做错了什么?”

【问题讨论】:

    标签: php wordpress woocommerce hook-woocommerce orders


    【解决方案1】:

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

    • 两个钩子只有 1 个参数(不是 2 个,所以 $values 不存在)
    • 要获取您的自定义字段,您应该改用$_POST['myValue']
    • 和其他类似每个钩子的东西都有不同的参数:
      • $order_idwoocommerce_checkout_update_order_meta
      • $orderwoocommerce_checkout_create_order

    下面我已将$_POST['myValue'] 替换为$_POST['billing_country'],因为您没有提供此自定义结帐字段的代码……

    所以这是两种方式:

    1) 对我来说最好的方法,正如 here 解释的那样:

    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 文件中。经过测试并且可以工作。

    证明:

    (在数据库wp_postmeta 表中此订单ID)

    在 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 文件中。经过测试并且可以工作。


    相关:Add extra meta for orders in Woocommerce

    【讨论】:

    • Added an answer 不是评论,在这种情况下评论是简短且受限的。
    【解决方案2】:

    因为 cmets 真的很难阅读(因为格式受到很大限制),所以这个答案只是对answer from LoicTheAztec 的回应。

    我写了一个更长的答案,但它似乎消失了,所以我现在很抱歉更短的答案!

    首先我们的误解

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

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

    推荐一开始不起作用的方法

    您建议的所有推荐方式均无效。我还把它们剥离了很多,以至于它们应该可以工作,只是在元数据中写一些东西。我不知道这次是哪个插件/主题功能在这里恶作剧了。

    但我能够解决问题

    还有更多!只是因为我在过去发现的地方找到了the blog-post,如何做到这一点以及作为我个人运气的补充,作者已经写了与此过程相关的changes for WP3.0

    你的帖子仍然对我有帮助

    从那时起,您向我展示的错误一直困扰着我,因为使用 Sublime 和 CodeIntel(以及我从 Symfony 本身开始)很难跟踪和检查所有内容,我决定购买 PHPStorm,它显示并允许我修复所有已弃用的问题(旧版使用)函数,通过正确更新它们。

    (终于不再有全局变量了:耶。)

    我的意思是,显示参数 inline 和 deprecation-strokes 已经做得很好了。但是,在大型项目中不会死掉的无错误的工作代码-intel/reference 真是太棒了。

    这就是为什么我现在将您的答案标记为解决方案,谢谢。否则我可能会解决问题(感谢作者的博客文章),但仍然会坐在定时炸弹上。

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 2020-12-30
      • 2018-08-04
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2021-06-01
      • 2018-12-31
      相关资源
      最近更新 更多