Woocommerce:替换已弃用的挂钩"woocommerce_add_order_item_meta"

use*_*988 12 php wordpress orders woocommerce hook-woocommerce

需要为订单商品添加自定义元.谷歌搜索它,大多数文章说使用"woocommerce_add_order_item_meta"钩子.此挂钩在最新版本2.3.7中已弃用.有人,请告诉我使用哪个钩子.

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

hel*_*ing 17

如果你看,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 );
}
Run Code Online (Sandbox Code Playgroud)

基本上,该函数已重命名为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 );
Run Code Online (Sandbox Code Playgroud)

  • 现在不推荐使用钩子,所以这个答案是不正确的 (2认同)

Loi*_*tec 14

2017/2018正确的方式 (使用新的CRUD设置器和Getters方法)

相关:在Woocommerce 3.4中替换woocommerce_add_order_item_meta hook

由于woocommerce 3已经改进了许多改变的东西,woocommerce_add_order_item_meta即使在woocommerce版本3.3+中,动作钩子仍然可以完美地工作.

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

现在,随着Woocommmerce 3引入了新的CRUD setter和getters方法,使用的类似替换钩子woocommerce_checkout_create_order_line_item具有与cart数据类似的有用参数.

woocommerce_new_order_item是真的不方便购物车的数据不可访问.

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

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

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

例:

## --- 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'] );
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我们可以使用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'] );
    }
}
Run Code Online (Sandbox Code Playgroud)

结论: woocommerce_checkout_create_order_line_item是与WooCommerce 3+一起使用的正确替换钩子以及新的CRUD设置器和getter方法.


Chr*_*rom 5

从版本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.
Run Code Online (Sandbox Code Playgroud)

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

  • 好的,要清楚.不推荐使用该钩子,并在弃用消息中获得建议以使用另一个钩子.但正如@LoicTheAztec所说,这个钩子不是一个完美的替代品,因为参数看起来不同.所以:不要遵循弃用消息中的建议(除非您完全控制代码).我总是试图摆脱所有通知,但在这种情况下,我将不得不忍受它 (2认同)