【问题标题】:Add extra meta for orders in Woocommerce在 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 全局变量,但我在插件中看不到它!

我的意思是我无法从我的插件或类似的东西中访问这个变量!

【问题讨论】:

    标签: php wordpress woocommerce metadata orders


    【解决方案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 论坛上的此主题:

    【讨论】:

    • 关于如何将自定义元字段(分配给订购商品的客户/用户)添加到订单元的想法?
    • 请注意,对钩子使用闭包并不是一个好主意,因为您以后无法使用 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 将在订单创建并保存到数据库后立即运行该函数。
      猜你喜欢
      • 2021-07-10
      • 2021-10-27
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多