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

Sas*_*cha 1 php wordpress orders woocommerce hook-woocommerce

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 个钩子是我尝试最多的一个,第 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Loi*_*tec 5

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

  • 两个钩子只有 1 个参数(不是 2,所以$values不存在)
  • 要获得您的自定义字段,您应该$_POST['myValue']改用。
  • 和每个钩子之类的其他东西都有不同的论点:
    • $order_id 为了 woocommerce_checkout_update_order_meta
    • $order 为了 woocommerce_checkout_create_order

下面我已替换$_POST['myValue']$_POST['billing_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');
    }
}
Run Code Online (Sandbox Code Playgroud)

代码位于您的活动子主题(或主题)的 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

代码位于您的活动子主题(或主题)的 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');
    }
}
Run Code Online (Sandbox Code Playgroud)

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


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