Agregar meta adicional para pedidos en WooCommerce

Estoy creando un complemento personalizado para mi sitio web.

En alguna parte de este complemento necesito almacenar meta adicional en wp_postmeta para cada pedido.

Agregué esto en la clase de mi complemento:

 `add_action ('woocommerce_before_checkout_process', array( &$this, 'add_item_meta', 10, 2) );` 

Y esta es la función add_item_meta() :

  function add_item_meta( $item_id, $values ) { wc_add_order_item_meta($item_id, '_has_event', 'yes' ); } 

Esta función no está completa, pero no ocurre nada con estos códigos; Creo que necesito usar otro gancho, pero no puedo encontrar uno adecuado.

¿Alguien sabe algo de esto?

También tengo otro problema con $item_id : ¡esta es la variable global de woocommerce pero no puedo verla en mi complemento!

¡Quiero decir que no tengo acceso a esta variable desde mi complemento o algo así!

Sobre la base de la respuesta de Mo Saeedi, creo que este fragmento está más en línea con el nuevo enfoque CRUD presentado por 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); 

Ver también estos hilos en los foros de WordPress:

  • Oh CRUDO! Meta personalizado para ordenar desde el carrito
  • ¿Cuál es la forma correcta de actualizar metacampos en WooCommerce?

la respuesta es: debería usar woocommerce_checkout_update_order_meta para add_action y también simplemente debería usar update_post_meta() para agregar meta adicional a mi pedido

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

El camino de 2016:

 add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) { update_post_meta( $order_id, 'my_custom_meta_key', 'my data' ); } , 10, 2); 
  • $order_id es la identificación del pedido, que se almacena como un tipo de publicación personalizado
  • $posted es todos los datos de $_POST

La forma 2018:

Basado en la respuesta de Guido WP puedes usar woocommerce_checkout_create_order action hook en un código de versión más ligero y efectivo (usando los métodos WC 3+ CRUD ) :

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

El código va en el archivo function.php de su tema hijo activo (o tema activo).

Probado y funciona en WooCommerce 3+ (solo) .


ALGUNAS EXPLICACIONES:

El woocommerce_checkout_create_order acción woocommerce_checkout_create_order es solo un paso antes de guardar los datos de la orden. Vea a continuación en un extracto del método WC_Checkout create_order() (con ambos ganchos):

 /** * 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; 

¿Por qué utilizar woocommerce_checkout_create_order en woocommerce_checkout_create_order lugar? :

  • Porque no necesita usar $order = wc_get_order( $order_id ); como ya obtuvo $order como argumento en la función hooked.
  • No necesita usar $order->save(); como esto se hará justo después de todos modos (ver el código fuente)
  • También se ha lanzado woocommerce_checkout_create_order en la versión 3 de WooCommerce y también woocommerce_checkout_create_order para eso.

Entonces esto solo funciona con una sola línea de código dentro de la función.