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