Add extra meta for orders in Woocommerce Add extra meta for orders in Woocommerce wordpress wordpress

Add extra meta for orders in Woocommerce


The 2018 way:

Built on Guido W.P. answer you can use instead woocommerce_checkout_create_order action hook ina more lighter and effective version code (using WC 3+ CRUD methods):

add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);function before_checkout_create_order( $order, $data ) {    $order->update_meta_data( '_custom_meta_key', 'value' );}

Code goes in function.php file of your active child theme (or active theme).

Tested and works in WooCommerce 3+ (only).


SOME EXPLANATIONS:

The woocommerce_checkout_create_order action hook is just one step before saving the order data. See below in an extract of the WC_Checkout create_order() method (with both hooks):

/** * Action hook to adjust order before save. * @since 3.0.0 */do_action( 'woocommerce_checkout_create_order', $order, $data );// Save the order.$order_id = $order->save();do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data );return $order_id;

Why using woocommerce_checkout_create_order instead?:

  • Because You don't need to use $order = wc_get_order( $order_id ); as you already got $order as an argument in the hooked function.
  • You don't need to use $order->save(); as this will be done just after anyway (see the source code)
  • This hook has been released since WooCommerce version 3 and it's made for the same purpose, allowing to use all available WC_Order methods.

So this just works with a single line of code inside the function.


Building on Mo Saeedi answer, I believe this snippet is more in line with the new CRUD approach introduced by WooCommerce 3.0:

add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {    $order = wc_get_order( $order_id );    $order->update_meta_data( 'my_custom_meta_key', 'my data' );    $order->save();} , 10, 2);

See also this threads on the WordPress forums:


answer is:I should use woocommerce_checkout_update_order_meta for add_action and also i should simply use update_post_meta() to add extra meta to my order

    function add_item_meta( $order_id ) {            //global $woocommerce;            update_post_meta( $order_id, '_has_event', 'yes' );        }