在 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);
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
中进行检查(因为他们没有条件)。
答案 0 :(得分:3)
更新:您的代码中存在一些错误......
$values
不存在)$_POST['myValue']
代替。$order_id
woocommerce_checkout_update_order_meta
$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文件。经过测试和工作。
证据:
和(在此订单ID的数据库wp_postmeta
表中):
在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文件。经过测试和工作。
答案 1 :(得分:0)
由于评论很难阅读(因为格式化程度很大),这个答案只是对answer from LoicTheAztec的回复。
我写了一个更长的答案,但似乎已经不见了,所以我现在抱歉要短得多!
首先是我们的误解
您了解我想使用产品中的自定义值,但在我的情况下,它有点其他。我写了一个包含wp-load.php
的外部应用程序,然后将数据发布回产品页面到购物车中。
所以这里出现的问题是尝试在结账时将购物车中的数据写入订单。
推荐方法最初没有效果
您建议的所有建议方法都不起作用。我也把他们剥了很多,以至于他们应该工作,只是在元中写点东西。我不知道这次插件/主题功能让我恶作剧。
但我能够解决问题
还有更多!仅仅因为我找到了the blog-post我过去发现的地方,如何做到这一点,作为我个人运气的补充,作者已经写了与此过程相关的changes for WP3.0。
您的帖子仍然帮助了我
你告诉我的错误从那时起就让我感到烦恼,因为很难用Sublime和CodeIntel来跟踪和检查所有内容(我开始使用Symfony本身)我决定购买PHPStorm,它显示并允许我修复所有我弃用的内容(遗留使用)功能通过正确更新它们。
(最后没有更多的全局变量:耶。)
我的意思是,显示参数内联和弃用笔画已经做得很好。但是一个没有错误的工作代码 - 英特尔/参考,并没有在大型项目上死亡,这真是太棒了。
这就是为什么我现在将你的答案标记为解决方案,谢谢。否则我可能已经解决了问题(感谢作者的博客文章),但仍会坐在定时炸弹上。