php wordpress woocommerce hook-woocommerce orders

php - Woocommerce: Qué gancho para reemplazar "woocommerce_add_order_item_meta" en desuso



wordpress hook-woocommerce (8)

Necesita agregar meta personalizados para ordenar artículos. Buscó en Google y la mayoría de los artículos dice que use el gancho "woocommerce_add_order_item_meta". Este gancho está en desuso en la versión más reciente 2.3.7. Alguien, por favor dime qué gancho usar en su lugar.

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


No, parece que el gancho también está en desuso: Error de PHP: El gancho "woocommerce_add_order_item_meta" usa estructuras de datos obsoletas y la función está en desuso desde la versión 3.1.2. Reemplazar con woocommerce_new_order_item.

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


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 acción ''woocommerce_add_order_item_meta'' con ''woocommerce_new_order_item'' en una declaració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 desaprobación.


Quería agregar a la respuesta de Ilgıt Yıldırım: en mi caso, mis valores personalizados no existían en la matriz item-> legacy_values. Para solucionar esto, utilicé el gancho woocommerce_checkout_create_order_line_item para agregar los valores personalizados al elemento antes de llamar al gancho 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 llame al nuevo enlace: add_action (''woocommerce_new_order_item'', ''add_product_input_fields_to_order_item_meta_wc3'', PHP_INT_MAX, 3);

función 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 }

}


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 reference );

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


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, wc_add_order_item_meta() . El gancho de acción no fue renombrado 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 );


Solo para aclarar las cosas, esta función estaba en desuso, pero el gancho todavía está bien


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

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


2017/2018 DE LA MANERA CORRECTA (Uso de nuevos setters CRUD y métodos Getters)

Relacionado: Reemplazar el gancho woocommerce_add_order_item_meta en Woocommerce 3.4

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

Este WC_Checkout está habilitado por los métodos de clase WC_Checkout y las funciones relacionadas en el proceso de pago 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 configuración y obtención de 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 clave hash única del artículo 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 enlace reemplazaremos las antiguas funciones de trabajo wc_add_order_item_meta () por el nuevo WC_Data update_meta_data() que se utilizará con $item argumento $item .

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 el método anterior usando 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 adecuado para usar con WooCommerce 3+ y los nuevos métodos CRUD setters y getters.