在 Woocommerce 中为订单添加额外的元数据
Posted
技术标签:
【中文标题】在 Woocommerce 中为订单添加额外的元数据【英文标题】:Add extra meta for orders in Woocommerce 【发布时间】:2014-10-26 21:01:44 【问题描述】:我正在为我的网站创建一个自定义插件。
在这个插件的某些部分,我需要为每个订单在wp_postmeta
中存储额外的元数据。
我在插件的类中添加了这个:
add_action ('woocommerce_before_checkout_process', array( &$this, 'add_item_meta', 10, 2) );
这是add_item_meta()
函数:
function add_item_meta( $item_id, $values )
wc_add_order_item_meta($item_id, '_has_event', 'yes' );
此功能不完整,但此代码没有任何反应;我想我需要使用另一个钩子,但我找不到合适的。
有人知道吗?
$item_id
也有另一个问题:这是 woocommerce 全局变量,但我在插件中看不到它!
我的意思是我无法从我的插件或类似的东西中访问这个变量!
【问题讨论】:
【参考方案1】:2018 年的方式:
基于 Guido W.P. 答案,您可以使用 woocommerce_checkout_create_order
动作挂钩代替
更轻巧有效的版本代码(使用WC 3+ CRUD methods):
add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);
function before_checkout_create_order( $order, $data )
$order->update_meta_data( '_custom_meta_key', 'value' );
代码进入您的活动子主题(或活动主题)的 function.php 文件中。
在 WooCommerce 3+ 中测试和工作(仅限)。
一些解释:
woocommerce_checkout_create_order
操作挂钩只是保存订单数据之前的一步。请参阅下面的WC_Checkout
create_order()
方法的摘录(带有两个挂钩):
/**
* Action hook to adjust order before save.
* @since 3.0.0
*/
do_action( 'woocommerce_checkout_create_order', $order, $data );
// Save the order.
$order_id = $order->save();
do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data );
return $order_id;
为什么要改用
因为您不需要使用woocommerce_checkout_create_order
?:$order = wc_get_order( $order_id );
,因为您已经将$order
作为挂钩函数中的参数。 您不需要使用$order->save();
,因为无论如何这将在之后完成(请参阅源代码) 此钩子自 WooCommerce 版本 3 以来已发布,其目的相同,允许使用所有可用的WC_Order
方法。所以这只是在函数内使用一行代码。
【讨论】:
这很聪明@LoicTheAztec!我只有一个疑问:它是否像使用woocommerce_checkout_update_order_meta
一样面向未来?似乎 woocommerce_checkout_update_order_meta
是由 WooCommerce 开发人员放置在那里的,目的是为了更新订单元数据。我可能是错的,但是为特定目的使用另一个过滤器让我有点不舒服。
@GuidoWalterPettinari 您可以在同一个挂钩函数中使用,为不同目的编写代码,或者在同一个挂钩中以不同的优先级挂钩两个不同的函数……这没什么大不了的 :)……所以两个代码效果也很好……唯一的区别是 我的只是比你的轻一点,因为我不记得 WC_Order 对象的实例,而且我不需要使用 save() 方法……
嗨洛伊克!我您的解决方案确实比我的更快,但我不会说这是唯一的区别。根据过滤器名称,WooCommerce 团队可能希望我们使用过滤器 woocommerce_checkout_update_order_meta
更新订单元数据。我的观点是,忽视这一提示以增加几毫秒的执行时间可能是不明智的,特别是因为 WooCommerce 更新如此频繁并且并不总是尊重向后兼容性。我有点偏执,我知道?
@GuidoWalterPettinari 我不同意,因为woocommerce_checkout_create_order
是 CRUD setter 和 getter 的佣人,并且已与 WC 3 同时发布... 之前CRUD setter 和 getter 方法 (所以在 WooCommerce 3 之前),唯一的方法是 woocommerce_checkout_update_order_meta
使用 update_post_meta()
WP 函数,例如......所以没问题,我只是在我的回答中提供关于 CRUD 方法使用的好选择。就这样。没什么大不了的……
感谢您的澄清,@LoicTheAztec!这是有道理的,让我们希望 WooCommerce 团队在某个时候澄清这个(小)问题。祝你有美好的一天,圭多【参考方案2】:
基于 Mo Saeedi 的回答,我相信这个 sn-p 更符合 WooCommerce 3.0 引入的new CRUD approach:
add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted )
$order = wc_get_order( $order_id );
$order->update_meta_data( 'my_custom_meta_key', 'my data' );
$order->save();
, 10, 2);
另请参阅 WordPress 论坛上的此主题:
Oh CRUD! Custom Meta to order from cart What is the correct way to update meta fields in Woocommerce?【讨论】:
关于如何将自定义元字段(分配给订购商品的客户/用户)添加到订单元的想法? 请注意,对钩子使用闭包并不是一个好主意,因为您以后无法使用remove_action
删除它们。
注意你现在应该使用new WC_Order($order_id);
而不是wc_get_order
【参考方案3】:
答案是:
我应该使用 woocommerce_checkout_update_order_meta
进行 add_action 并且我应该简单地使用 update_post_meta()
为我的订单添加额外的元数据
function add_item_meta( $order_id )
//global $woocommerce;
update_post_meta( $order_id, '_has_event', 'yes' );
【讨论】:
【参考方案4】:2016 年之路:
add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted )
update_post_meta( $order_id, 'my_custom_meta_key', 'my data' );
, 10, 2);
$order_id
是订单的id,存储为自定义帖子类型
$posted
是来自$_POST
的所有数据
【讨论】:
该代码在系统中的什么位置?在什么文件里?这种方法是否会将自定义数据暴露给 Order API 调用,例如 shop.example.com/wc-api/v3/orders/1248 您可以将此代码直接放入主题的functions.php
文件中。 WooCommerce 将在订单创建并保存到数据库后立即运行该函数。以上是关于在 Woocommerce 中为订单添加额外的元数据的主要内容,如果未能解决你的问题,请参考以下文章
在 WooCommerce 中为特定用户角色创建订单时添加额外的客户注释
php Event Tickets Plus:在WooCommerce订单电子邮件的末尾添加额外的换行符。
php Event Tickets Plus:在WooCommerce订单电子邮件的末尾添加额外的换行符。