Woocommerce:替换已弃用的挂钩“woocommerce_add_order_item_meta”

时间:2015-04-16 06:23:24

标签: php wordpress woocommerce hook-woocommerce orders

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

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

8 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:11)

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

  

相关:Replace woocommerce_add_order_item_meta hook in Woocommerce 3.4

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

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

  

现在,当 Woocommmerce 3引入了新的CRUD设置器和getter方法时,类似的替换钩子是 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对象的实例(在某些特定情况下,这是一个非常有用的附加参数)

在这个钩子中,我们将用新的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钩子以旧方式执行相同操作,因为它具有几乎相同的有用参数:

## --- 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设置器和getter方法一起使用的正确替代钩子。

答案 2 :(得分: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.

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

答案 3 :(得分:3)

我知道这已经得到了答复,并且已经有一个已接受的回复。我只想提供另一种方法来处理这个问题而不实际获得一条弃用的消息(参见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'])
    );
}

答案 4 :(得分:1)

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

customizing checkout fields中阅读更多内容。

答案 5 :(得分:1)

我想补充一下IlgıtYı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
            }

}

答案 6 :(得分:0)

为了清楚说明,此功能已弃用,但the hook仍然可以

答案 7 :(得分:0)

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

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