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

时间:2018-02-27 22:51:59

标签: php wordpress woocommerce hook-woocommerce orders

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);
  3. Hook number 1是我最常尝试的那个,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();
        }
    }
    

    如果至少会创建两个 _TESTKEY * -meta-entrys,我也会在mySQL表table wp_woocommerce_order_itemmeta中进行检查(因为他们没有条件)。

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

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

2 个答案:

答案 0 :(得分:3)

更新:您的代码中存在一些错误......

  • 两个钩子只有一个参数(不是2,所以$values不存在)
  • 要获取自定义字段,您应该使用$_POST['myValue']代替。
  • 和每个钩子之类的其他东西有不同的参数:
      {li> $order_id woocommerce_checkout_update_order_meta {li> $order woocommerce_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文件。经过测试和工作。

证据:

enter image description here

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

enter image description here

  

在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

答案 1 :(得分:0)

由于评论很难阅读(因为格式化程度很大),这个答案只是对answer from LoicTheAztec的回复。

我写了一个更长的答案,但似乎已经不见了,所以我现在抱歉要短得多!

首先是我们的误解

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

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

推荐方法最初没有效果

您建议的所有建议方法都不起作用。我也把他们剥了很多,以至于他们应该工作,只是在元中写点东西。我不知道这次插件/主题功能让我恶作剧。

但我能够解决问题

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

您的帖子仍然帮助了我

你告诉我的错误从那时起就让我感到烦恼,因为很难用Sublime和CodeIntel来跟踪和检查所有内容(我开始使用Symfony本身)我决定购买PHPStorm,它显示并允许我修复所有我弃用的内容(遗留使用)功能通过正确更新它们。

(最后没有更多的全局变量:耶。)

我的意思是,显示参数内联和弃用笔画已经做得很好。但是一个没有错误的工作代码 - 英特尔/参考,并没有在大型项目上死亡,这真是太棒了。

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