Woocommerce: qué gancho para reemplazar obsoleto “woocommerce_add_order_item_meta”

Necesita agregar meta personalizada para ordenar elementos. Lo busqué en Google y la mayoría de los artículos dicen que use el enlace “woocommerce_add_order_item_meta”. Este enlace está obsoleto en la versión más reciente 2.3.7. Alguien, por favor dígame qué gancho usar en su lugar.

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

Si nos fijamos en wc-deprecated-functions.php , verá

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

Básicamente, la función se renombró a wc_add_order_item_meta() , por lo que si necesita la función, entonces use eso. El gancho de acción no cambió de nombre y permanece en class-wc-checkout.php como:

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

2017/2018 LA MANERA CORRECTA (utilizando los nuevos métodos setters CRUD y Getters)

Relacionado: Reemplace woocommerce_add_order_item_meta hook en Woocommerce 3.4

Desde woocommerce 3 que ha mejorado muchas cosas haciendo cambios drásticos, el hook de acción woocommerce_add_order_item_meta aún funciona perfectamente incluso en woocommerce versión 3.3+.

Este WC_Checkout está habilitado por los métodos de la clase WC_Checkout y las funciones relacionadas en el proceso de WC_Order la compra y no en la clase WC_Order donde los datos del carrito ya no están disponibles.

Ahora que Woocommmerce 3 ha introducido nuevos métodos de arregladores y getters CRUD , el gancho de reemplazo similar que se utilizará es woocommerce_checkout_create_order_line_item que tiene argumentos útiles similares a los datos del carrito.

El woocommerce_new_order_item realmente NO es conveniente ya que no se puede acceder a los datos del carrito.

Veamos cómo trabajar con woocommerce_checkout_create_order_line_item . Tiene 4 argumentos disponibles:

  • $item es una instancia de WC_Order_Item_Product nueva clase introducida
  • $cart_item_key es la tecla de hash única del elemento del carrito
  • $values es el artículo del carrito
  • $order una instancia del objeto WC_Order (Este es un argumento adicional muy útil en algunos casos específicos)

En este enganche reemplazaremos las funciones de trabajo anteriores wc_add_order_item_meta () por el nuevo WC_Data update_meta_data() que se usará con $item argument.

Ejemplo:

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

Finalmente, podemos hacer lo mismo con la forma anterior utilizando woocommerce_add_order_item_meta hook ya que tiene casi los mismos argumentos útiles:

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

Conclusión: woocommerce_checkout_create_order_line_item es el gancho de reemplazo correcto para ser utilizado con WooCommerce 3+ y los nuevos métodos setters y getters de CRUD.

Parece que el gancho ahora también está en desuso a partir de la versión 3.0.4. Recibo esta notificación:

 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. 

He reemplazado el nombre de la acción ‘woocommerce_add_order_item_meta’ con ‘woocommerce_new_order_item’ en una instrucción add_action en un complemento ofensivo, y la notificación de desaprobación desaparece. El problema es que algunos parámetros ahora aparecen dentro de una matriz legacy_values . Utilizo el complemento YITH WooCommerce Product Add Ons, y los metadatos del producto que deben adjuntarse a un pedido no son recogidos por el complemento y, por lo tanto, no se almacenan con el pedido. Entonces, hasta que esto se solucione en el complemento, debe vivir con la notificación de obsolescencia.

Sé que esto ha sido respondido y ya hay una respuesta aceptada. Solo quería dar otra forma de manejar esto sin obtener un mensaje obsoleto (ver referencia );

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

Su caso de uso específico no es muy claro (no especificó cuándo o dónde debe agregar esta metainformación), pero puede usar woocommerce_checkout_update_order_meta durante la compra.

Lea más en la personalización de los campos de pago .

Quería agregar a la respuesta de Ilgıt Yıldırım: en mi caso, mis valores personalizados no existían en el elemento-> matriz legacy_values. Para solucionarlo, utilicé el gancho woocommerce_checkout_create_order_line_item para agregar los valores personalizados al artículo antes de llamar al enganche woocommerce_new_order_item. Aquí hay un ejemplo de eso:

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; 

}

// ENTONCES llamamos al nuevo gancho: 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 } 

}

Solo para aclarar las cosas, esta función fue obsoleta, pero el gancho todavía está bien

No, parece que el enlace también está en desuso: Error de PHP: el enlace “woocommerce_add_order_item_meta” utiliza estructuras de datos desactualizadas y la función está en desuso desde la versión 3.1.2. Reemplace con woocommerce_new_order_item.

Tampoco puedo encontrarlo aquí: https://docs.woocommerce.com/wc-apidocs/hook-docs.html

Intereting Posts