为了账号安全,请及时绑定邮箱和手机立即绑定

Woocommerce:替换哪个钩子已弃用的“ woocommerce_add_order”

Woocommerce:替换哪个钩子已弃用的“ woocommerce_add_order”

PHP
qq_花开花谢_0 2019-11-04 10:28:32
需要向订单项添加自定义元。用Google搜索它,大多数文章说使用“ woocommerce_add_order_item_meta”钩子。最新版本2.3.7不推荐使用此挂钩。有人,请告诉我使用哪个挂钩。http://docs.woothemes.com/wc-apidocs/function-woocommerce_add_order_item_meta.html
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

如果你看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 );


查看完整回答
反对 回复 2019-11-04
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

由于woocommerce 3进行了许多改进,改进了许多事情,因此woocommerce_add_order_item_meta即使在woocommerce版本3.3+中,动作挂钩仍然可以完美工作。


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


现在,随着Woocommmerce 3引入了新的CRUD setter和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 是购物车项目

$orderWC_Order对象的实例(在某些特定情况下,这是一个非常有用的附加参数)

在这个钩子中,我们将旧的工作函数wc_add_order_item_meta()替换为WC_Data 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设置器和获取器方法一起使用的正确替换钩子。


查看完整回答
反对 回复 2019-11-04
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

从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产品附加组件,该插件未提取应附加到订单的产品元数据,因此未与订单一起存储。因此,在插件中解决此问题之前,您必须先接受弃用通知。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 625 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信