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 deWC_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.