在WooCommerce 3.0发布之前,我的代码已经像魔法一样工作,将自定义值从购物车保存到结账时的订单中。但从那以后,我无法为订单创建自定义元。
环境:WordPress4.9。4.
add_action('woocommerce_checkout_update_order_meta','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();
}
}
我还检查了mySQL表
wp_woocommerce_order_itemmeta
是否至少会创建两个_TESTKEY*-元入口(因为它们没有条件)。
但是看起来元键和值并不是通过这个钩子和函数创建的
函数本身正在被调用,因此至少钩子本身正在工作
因为注释真的很难阅读(因为格式非常有限),所以这个答案只是对LoicTheAztec答案的回应。
我写了一个较长的答案,但它似乎已经不见了,所以我现在很抱歉写了一个较短的答案!
首先是我们的误解
您知道我想使用产品的自定义值,但在我的情况下,它有点不同。我写了一个外部应用程序,其中包括wp-load.php
,然后将数据发布回产品页面到购物车中。
所以这里出现的问题是试图在结账时将购物车中的数据写入订单。
推荐方式一开始并不奏效
你建议的推荐方式都不起作用。我还把它们剥离了很多,以至于它们应该工作,只是在元数据中写些东西。我不知道这一次是哪个插件/主题功能戏弄了我。
但我能解决问题
等等!仅仅因为我找到了我在过去发现的博客文章,如何做到这一点,作为我个人的运气,作者已经为WP3.0写了与这个过程相关的变化。
还是你的帖子帮了我
从那以后,你给我看的错误一直困扰着我,因为很难用Sublime和CodeIntel(以及我从Symfony开始)来跟踪和检查一切,所以我决定购买PHPStorm,它显示并允许我修复我所有不建议使用的(遗留使用的)功能通过正确更新它们。
(最后,不再有全局变量:耶。)
我的意思是,内联显示参数和弃用笔划已经做得很好了。但是一个没有bug的工作代码intel/reference在大型项目中不会消亡,这真是太棒了。
这就是为什么我把你的答案标记为解决方案,谢谢。否则我可能会解决这个问题(多亏了作者的博客文章),但仍然会坐在一个滴答作响的定时炸弹上。
更新:您的代码中有一些错误…
$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) 对我来说,最好的方法是:
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活动子主题(或主题)的文件中。测试和工作。
相关:为Woocommerce中的订单添加额外的元数据
我正试图在结帐时将定制费用计入订单总额。我在woocommerce中添加了一个复选框 包含一个自定义js文件,可用于处理事件 和一个php费用处理函数 由于某些原因,$_POST['state']的值没有被添加,当我给出一个硬编码值时,函数会工作,我尝试了很多选项,但无法让它工作。 我看过类似的帖子,但没有一个有答案。
我使用的是一个自定义的帖子类型和集成的woocommerce,我可以在页面上添加一个AddtoCart按钮,并可以将其添加到cart,所以效果很好 这是我的密码 但现在我需要在产品页面上添加一些自定义字段,一个包含颜色“黑色”和“白色”的下拉列表,这只是一个普通的下拉列表。当我选择一个将在购物车上显示在产品名称下的值时,我该怎么做
WordPress-WooCommerce 我想做的是: null 邮件里什么也没印。 请解决。提前谢了。
我正在为一个自定义的woocommerce结帐表单的多选字段而挣扎。 我通过函数创建了自定义multislect字段: 请注意,woocommerce函数无法创建自定义多选字段,因此这里有一个简单的选择字段。 我决定使用jQuery以这种方式添加多个缺失的属性: 现在我有了multiselect字段,它看起来像: 问题是,顺序元值没有正确更新,它每次只显示一个值,而不是一个数组的值,如果人选择一个
使用以下代码,我可以在WooCommerce产品上获得一个自定义字段,但是如何在订单、结帐和管理订单(后端)上显示它呢? 这是我在每个产品上的自定义字段 这是我的管理订单(后端)详细信息。我尝试显示我在每个产品帖子中输入的正确元数据。 如何在管理订单中显示我在自定义字段中输入的值?我也希望有人能帮助我显示在订单和结帐页面的元。。。或者引导我走向正确的方向。我意识到,为了在管理订单中显示它,我必须确