在 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 中为特定用户角色创建订单时添加额外的客户注释

在 WooCommerce 中为新客户订单添加订单备注

php Event Tickets Plus:在WooCommerce订单电子邮件的末尾添加额外的换行符。

php Event Tickets Plus:在WooCommerce订单电子邮件的末尾添加额外的换行符。

在 WooCommerce 管理员订单列表中添加带有付款网址的自定义列

Woocommerce - 如何在自定义页面上显示当前用户的订单?