Woocommerce: Which hook to replace deprecated "woocommerce_add_order_item_meta" Woocommerce: Which hook to replace deprecated "woocommerce_add_order_item_meta" wordpress wordpress

Woocommerce: Which hook to replace deprecated "woocommerce_add_order_item_meta"


2017/2018 THE RIGHT WAY (Using new CRUD setters and Getters methods)

Related: Replace woocommerce_add_order_item_meta hook in Woocommerce 3.4

Since woocommerce 3 that has improved many things making drastic changes, the action hook woocommerce_add_order_item_meta still work perfectly even in woocommerce version 3.3+.

This hook is enabled by WC_Checkout class methods and related functions in the checkout process and not in WC_Order Class where cart data is not anymore available.

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.

Let see how to work with woocommerce_checkout_create_order_line_item. It has 4 available arguments:

  • $item is an instance of WC_Order_Item_Product new introduced Class
  • $cart_item_key is the cart item unique hash key
  • $values is the cart item
  • $order an instance of the WC_Order object (This is a very useful additional argument in some specific cases)

In this hook we will replace the old working functions wc_add_order_item_meta() by the new WC_Data update_meta_data() method to be used with $item argument.

Example:

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

Finally we can do the same with old way using woocommerce_add_order_item_meta hook as it has nearly the same useful arguments:

## --- 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.


If you look at wc-deprecated-functions.php you will see

/** * @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 );}

Basically, the function was renamed to wc_add_order_item_meta(), so if you need the function then use that. The action hook was not renamed and remains in class-wc-checkout.php as:

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


It seems that the hook is now also deprecated as of version 3.0.4.I'm getting this notification:

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.

I have replaced the action name 'woocommerce_add_order_item_meta' with 'woocommerce_new_order_item' in an add_action statement in an offending plugin, and the deprecation notification disappears, The problem is that some parameters now appear inside a legacy_values array. I use the plugin YITH WooCommerce Product Add Ons, and the product meta data that should be attached to an order is not picked up by the plugin and therefore not stored with the order. So until this is fixed in the plugin you have to live with the deprecation notification.