php - Woocommerce:要替换哪个 Hook 已弃用 "woocommerce_add_order_item_meta"

标签 php wordpress woocommerce hook-woocommerce orders

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

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

最佳答案

2017/2018 正确方法 (使用新的 CRUD setter 和 Getters 方法)

Related: Replace woocommerce_add_order_item_meta hook in Woocommerce 3.4

由于 woocommerce 3 改进了许多功能并做出了巨大的改变,因此即使在 woocommerce 版本 3.3+ 中,操作 Hook woocommerce_add_order_item_meta 仍然可以完美工作。

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

Now as Woocommmerce 3 has introduced new CRUD setters and getters methods, the similar replacement hook to be used is woocommerce_checkout_create_order_line_item that has similar useful arguments as cart data.

The woocommerce_new_order_item is really NOT convenient as cart data is not accessible.

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

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

在此 Hook 中,我们将用新的 WC_Data update_meta_data() 方法替换旧的工作函数 wc_add_order_item_meta() ,与 $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 Hook 以旧方式执行相同操作,因为它具有几乎相同的有用参数:

## --- 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'] );
    }
}

Conclusion: woocommerce_checkout_create_order_line_item is the right replacement hook to be used with WooCommerce 3+ and that new CRUD setters and getters methods.

关于php - Woocommerce:要替换哪个 Hook 已弃用 "woocommerce_add_order_item_meta",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29666820/

相关文章:

html - 无法让 Bootstrap 嵌套的行/列正确排列

php - 避免对某些自动完成的订单重复发送电子邮件通知

php - 在 Woocommerce 的账单明细之前添加一个新的自定义结帐字段?

php - 打开php文件声明问题

jquery - 在 wordpress 分页数字周围添加边框?

php - Redux 框架幻灯片字段 - wp_editor 而不是文本字段

css - Woocommerce 中的迷你购物车按钮未对齐?

mysql - 如何在 MySQL 表中存储 php 对象?

php - 选择两个日期之间的数据

php - SQL : can I JOIN 2 tables according the first table "array" value?