【问题标题】:Woocommerce: Which hook to replace deprecated "woocommerce_add_order_item_meta"Woocommerce:哪个钩子可以替换已弃用的“woocommerce_add_order_item_meta”
【发布时间】:2015-06-22 09:26:30
【问题描述】:

需要添加自定义元来订购商品。谷歌搜索,大多数文章都说使用“woocommerce_add_order_item_meta”钩子。这个钩子在最新版本 2.3.7 中已弃用。有人,请告诉我改用哪个钩子。

http://docs.woothemes.com/wc-apidocs/function-woocommerce_add_order_item_meta.html

【问题讨论】:

    标签: php wordpress woocommerce hook-woocommerce orders


    【解决方案1】:

    您的具体用例不是很清楚(您没有指定何时何地需要添加此元信息),但您可以在结帐时使用woocommerce_checkout_update_order_meta

    customizing checkout fields阅读更多内容。

    【讨论】:

    • 很抱歉。我有一个自定义帖子类型“服务”,当客户填写服务表格时,我必须将产品(计划)添加到购物车并将服务 ID 传递给该产品。我已经完成了,现在想将该 id 传递给 order item meta。购物车也会有其他产品...
    【解决方案2】:

    如果您查看wc-deprecated-functions.php,您会看到

    /**
     * @deprecated
     */
    function woocommerce_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique = false ) {
        return wc_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique );
    }
    

    基本上,函数被重命名为wc_add_order_item_meta(),所以如果你需要这个函数,就使用它。 action hook 没有被重命名并保留在class-wc-checkout.php 中:

    // Allow plugins to add order item meta
    do_action( 'woocommerce_add_order_item_meta', $item_id, $values, $cart_item_key );
    

    【讨论】:

    • 钩子现在已经被弃用了,所以这个答案是不正确的
    • 这是 2015 年的正确答案。:) 但是,@LoicTheAztec 似乎已经有了更新和正确的答案,所以每个人都应该遵守:stackoverflow.com/a/49419394/383847
    【解决方案3】:

    为了清楚起见,这个功能已被弃用,但the hook 仍然可以

    【讨论】:

      【解决方案4】:

      似乎从 3.0.4 版开始,该钩子现在也已被弃用。 我收到此通知:

      The The "woocommerce_add_order_item_meta" hook uses out of date data structures and function is deprecated since version 3.0.4. Replace with woocommerce_new_order_item.
      

      我在有问题的插件的 add_action 语句中将操作名称 'woocommerce_add_order_item_meta' 替换为 'woocommerce_new_order_item',弃用通知消失了,问题是一些参数现在出现在 legacy_values 数组中。我使用插件 YITH WooCommerce 产品附加组件,并且应该附加到订单的产品元数据不会被插件拾取,因此不会与订单一起存储。因此,在插件中修复此问题之前,您必须接受弃用通知。

      【讨论】:

      • 抱歉,但 woocommerce_new_order_item 不能替换 woocommerce_add_order_item_meta ... 所以这是一个答案吗?还是一个问题?...请注意,在这两种情况下,您都应该用正确的东西更新它并经过测试......或者如果没有,就删除它。谢谢
      • 好的,要清楚。该钩子已被弃用,您会在弃用消息中获得使用另一个钩子的建议。但正如@LoicTheAztec 所说,这个钩子并不是一个完美的替代品,因为参数看起来不同。所以:不要遵循弃用消息中的建议(除非您完全控制代码)。我总是试图摆脱所有通知,但在这种情况下,我将不得不忍受它
      【解决方案5】:

      我知道这已得到答复,并且已接受答复。我只是想提供另一种方法来处理此问题,而不会实际收到已弃用的消息(请参阅reference);

      add_action('woocommerce_new_order_item', 'saveMetaData', 10, 3); // or use just 2 instead of 3; if you don't need order id
      
      /**
       * Add meta to order item
       *
       * @param int $itemId
       * @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
       * @param int @orderId
      */
      function saveMetaData($itemId, $item, $orderId)
      {
          if (!isItemValid($item))
          {
              return;
          }
      
          wc_add_order_item_meta($itemId, 'my_custom_data', $item->legacy_values['my_custom_data']);
      }
      
      /**
       * @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
       *
       * @return bool
      */
      function isItemValid($item)
      {
          return (
              $item instanceof WC_Order_Item_Product &&
              isset($item->legacy_values) &&
              isset($item->legacy_values['my_custom_data']) &&
              !empty($item->legacy_values['my_custom_data'])
          );
      }
      

      【讨论】:

        【解决方案6】:

        不,似乎钩子也被弃用了: PHP错误: “woocommerce_add_order_item_meta”钩子使用过时的数据结构,并且自版本 3.1.2 起已弃用函数。替换为 woocommerce_new_order_item。

        我在这里也找不到: https://docs.woocommerce.com/wc-apidocs/hook-docs.html

        【讨论】:

          【解决方案7】:

          我想补充 Ilgıt Yıldırım 的回答:就我而言,我的自定义值不存在于 item->legacy_values 数组中。为了解决这个问题,我使用 woocommerce_checkout_create_order_line_item 钩子在调用 woocommerce_new_order_item 钩子之前将自定义值添加到项目中。这是一个例子:

          add_action('woocommerce_checkout_create_order_line_item', 'save_values_in_item', PHP_INT_MAX, 4);

          function save_values_in_item($item, $cart_item_key, $values, $order) {

                          $item->myCustomValues = $values;
          

          }

          //然后调用新的钩子: add_action('woocommerce_new_order_item', 'add_product_input_fields_to_order_item_meta_wc3', PHP_INT_MAX, 3);

          function add_product_input_fields_to_order_item_meta_wc3( $item_id, $item, $order_id ) {

                      if ( isset( $item->myCustomValues ) ) 
                      {
                            //iterate through array and place desired values into the meta data using the wc_add_order_item_meta function
                      }
          

          }

          【讨论】:

            【解决方案8】:

            2017/2018 THE RIGHT WAY (使用新的 CRUD setter 和 Getters 方法)

            相关:Replace woocommerce_add_order_item_meta hook in Woocommerce 3.4

            自从 woocommerce 3 改进了很多东西并做出了巨大的改变,动作挂钩 woocommerce_add_order_item_meta 即使在 woocommerce 3.3+ 版本中仍然可以完美运行。

            此挂钩由 结帐过程中的WC_Checkout 类方法和相关函数启用,而不是在购物车数据不再可用的WC_Order 类中启用。

            现在 Woocommmerce 3 引入了新的 CRUD setter 和 getter 方法,要使用的类似替换挂钩是 woocommerce_checkout_create_order_line_item,它具有与购物车数据类似的有用参数。

            woocommerce_new_order_item 确实不方便,因为 无法访问购物车数据。

            让我们看看如何使用 woocommerce_checkout_create_order_line_item。它有 4 个可用参数:

            • $itemWC_Order_Item_Product 新引入类的实例
            • $cart_item_key 是购物车项的唯一哈希键
            • $values 是购物车项目
            • $order WC_Order 对象的实例(在某些特定情况下这是一个非常有用的附加参数)

            在这个钩子中,我们将用新的 WC_Data 方法替换旧的工作函数 wc_add_order_item_meta() update_meta_data()$item 参数一起使用。

            例子:

            ## --- New way --- ##
            add_action( 'woocommerce_checkout_create_order_line_item', 'custom_checkout_create_order_line_item', 20, 4 );
            function custom_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
                // Get a product custom field value
                $custom_field_value = get_post_meta( $item->get_product_id(), '_meta_key', true );
                // Update order item meta
                if ( ! empty( $custom_field_value ) ){
                    $item->update_meta_data( 'meta_key1', $custom_field_value );
                }
                // … … Or … …
            
                // Get cart item custom data and update order item meta
                if( isset( $values['custom_data'] ) ) {
                    $item->update_meta_data( 'meta_key2', $values['custom_data'] );
                }
            }
            

            最后,我们可以使用 woocommerce_add_order_item_meta 钩子对旧方法做同样的事情,因为它具有几乎相同的有用参数:

            ## --- Old way --- ##
            add_action( 'woocommerce_add_order_item_meta', 'custom_add_order_item_meta', 20, 3 );
            function custom_add_order_item_meta( $item_id, $values, $cart_item_key ) {
                // Get a product custom field value
                $custom_field_value = get_post_meta( $values['data']->get_id(), '_meta_key', true );
                // Update order item meta
                if ( ! empty( $custom_field_value ) ){
                    wc_add_order_item_meta( $item_id, 'meta_key1', $custom_field_value );
                }
                // … … Or … …
            
                // Get cart item custom data and update order item meta
                if( isset( $values['custom_data'] ) ) {
                    wc_add_order_item_meta( $item_id, 'meta_key2', $values['custom_data'] );
                }
            }
            

            结论:woocommerce_checkout_create_order_line_item 是与 WooCommerce 3+ 以及新的 CRUD setter 和 getter 方法一起使用的正确替代钩子。

            【讨论】:

            • 工作正常,谢谢。然而,有些参数并不完全可用。例如,$order 参数没有 ID,显然我们也不能拥有 $item_id
            • @PabloSGPacheco 抱歉,所有参数都可用:要获取 订单 ID,只需使用 $order_id = $order->get_id();商品 ID 只需使用 @ 987654345@…
            • @LoicTheAztec 感谢您的反馈,但在这两种情况下我都得到零。也许这有点道理。当woocommerce_checkout_create_order_line_item 被触发时,订单尚未创建。我说的对吗?
            • @PabloSGPacheco 订单还没有保存到数据库中,因为WC_Order save()方法稍后在WC_Checkout create_order()方法的末尾使用。
            • @LoicTheAztec 谢谢,所以这意味着我们不能有订单 ID 和商品 ID,对吗?
            猜你喜欢
            • 2021-06-14
            • 1970-01-01
            • 2022-08-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多