Woocommerce:哪个钩子可以替换已弃用的“woocommerce_add_order_item_meta”

需要添加自定义元来订购项目。谷歌搜索它,大多数文章说使用“woocommerce_add_order_item_meta”钩子。此挂接在最新版本 2.3.7 中已弃用。有人,请告诉我使用哪个钩子代替。

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


答案 1

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

相关:在Woocommerce 3.4中替换woocommerce_add_order_item_meta钩子

由于woocommerce 3已经改进了许多事情,因此即使在woocommerce版本3.3 +中,action hook仍然可以完美地工作。woocommerce_add_order_item_meta

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

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

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

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

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

在这个钩子中,我们将用新的update_meta_data()方法替换旧的工作函数wc_add_order_item_meta()与参数一起使用。WC_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 3 +和新的CRUD设置器和getters方法。woocommerce_checkout_create_order_line_item


答案 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()class-wc-checkout.php

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

推荐