Php 在Woocommerce 3中添加自定义签出字段作为订单自定义元数据
在WooCommerce 3.0发布之前,我的代码非常有效,可以在结账时将定制值从购物车保存到订单中。但从那时起,我就无法为订单创建自定义元 环境:Wordpress 4.9.4和WooCommerce 3.3.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
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)代码>
表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');
}
}