¿Cómo acceder a los metadatos personalizados de un ítem de pedido desde una meta clave en WooCommerce?
Estoy tratando de mostrar algunos metadatos personalizados que están asociados con el envío en un pedido de WooCommerce. Aquí está la historia completa de lo que estoy haciendo (para que pueda ayudar a alguien más y para que sepan exactamente lo que intento hacer)...
Cuando se crea un pedido, estoy adjuntando un tiempo de entrega como metadato al ítem de envío del pedido. Aquí está el código de referencia:
add_action( 'woocommerce_checkout_create_order_shipping_item', 'add_leadtime_meta', 20, 4 );
function add_leadtime_meta( &$item, $package_key, $package, $order ) {
$lt = get_current_lead_time();
$item->add_meta_data( 'Lead Time', $lt, true );
}
Cuando miro la base de datos, se está creando, y el order_item_id coincide con el order_item_id del envío en ese pedido, así que todo está funcionando bien (y puedo verlo mostrado en la vista de pedidos del backend).
Lo que estoy tratando de averiguar es cómo extraer manualmente estos datos para poder mostrarlos en varias ubicaciones del sitio (y en el correo electrónico). Estoy comenzando con la página de pedidos de la cuenta de usuario (/my-account/orders/). He agregado una columna para mostrar este valor y estoy tratando de averiguar cómo obtener los datos. Aquí está el código de cómo agregué una columna por si alguien tiene curiosidad:
add_filter( 'woocommerce_account_orders_columns', 'new_orders_columns' );
function new_orders_columns( $columns = array() ) {
// Ocultar las columnas
if( isset($columns['order-total']) ) {
// Elimina las columnas que quieres ocultar
unset( $columns['order-number'] );
unset( $columns['order-date'] );
unset( $columns['order-status'] );
unset( $columns['order-total'] );
unset( $columns['order-actions'] );
}
// Agregar columnas de nuevo con una nueva para poder establecer el orden
$columns['order-number'] = __( 'Factura', 'Text Domain' );
$columns['order-date'] = __( 'Fecha del Pedido', 'Text Domain' );
$columns['order-lead-time'] = __( 'Tiempo de Entrega', 'Text Domain' );
$columns['order-status'] = __( 'Estado', 'Text Domain' );
$columns['order-total'] = __( 'Total', 'Text Domain' );
$columns['order-actions'] = __( 'Acción', 'Text Domain' );
return $columns;
}
Donde estoy teniendo problemas es obteniendo el valor del tiempo de entrega que almacené anteriormente en la tabla. He intentado todo lo que se me ocurre y puedo encontrar en línea sin ayuda. Puedo acceder exitosamente a los arrays, así que sé que estoy cerca, pero hay algo que estoy haciendo mal con la búsqueda de los metadatos 'Lead Time' que no está funcionando. Aquí hay un ejemplo de lo que he intentado:
add_action( 'woocommerce_my_account_my_orders_column_order-lead-time', 'bs_order_lead_time_data' );
function bs_order_lead_time_data( $order ) {
foreach( $order->get_items( 'shipping' ) as $item_id => $shipping_item_obj ){
$shipping_method_id = $shipping_item_obj->get_method_id(); // El ID del método
$shipping_method_instance_id = $shipping_item_obj->get_instance_id(); // El ID de instancia
$lt1 = wc_get_order_item_meta( $shipping_method_id , 'Lead Time', $single = true );
$lt2 = wc_get_order_item_meta( $shipping_method_instance_id , 'Lead Time', $single = true );
$lt3 = get_post_meta( $shipping_item_obj, 'Lead Time', true );
//echo $shipping_method_id; //esto muestra 'free_shipping' FYI
//echo $shipping_method_instance_id; //esto muestra '2' FYI
//echo $lt1; //este no muestra nada...
//echo $lt2; //este no muestra nada...
//echo $lt3; //este no muestra nada...
echo $shipping_item_obj; //hacer esto me muestra el objeto de datos y el contenido que necesito está ahí.
}
}
Usando el último ejemplo del echo, aquí está el array de datos que estoy obteniendo:
{"id":39,"order_id":2050,"name":"Free shipping","method_title":"Free shipping","method_id":"free_shipping","instance_id":"2","total":"0.00","total_tax":"0","taxes":{"total":[]},"meta_data":[{"id":573,"key":"Items","value":"Test Part × 1"},{"id":574,"key":"Lead Time","value":"2 to 3 weeks"}]}
Estoy seguro de que me estoy perdiendo algo simple, pero no puedo encontrarlo. Cualquier ayuda sería apreciada.
Gracias,
Danny
Existen al menos 2 formas de obtener metadatos personalizados de ítems de pedido a partir de una clave meta definida:
1) Desde WooCommerce 3 - Usando el método WC_Data
get_meta()
2) La forma antigua - Usando la función de WooCommerce wc_get_order_item_meta()
Así que tu función enganchada bs_order_lead_time_data()
quedaría:
add_action( 'woocommerce_my_account_my_orders_column_order-lead-time', 'bs_order_lead_time_data' );
function bs_order_lead_time_data( $order ) {
foreach ( $order->get_items('shipping') as $item_id => $item ) {
// Usando el método WC_Data get_meta() desde WooCommerce 3
echo $item->get_meta('Lead Time');
// O la forma antigua (usando siempre el ID del ítem)
// echo wc_get_order_item_meta( $item_id , 'Lead Time', true );
}
}
El código va en el archivo functions.php de tu tema hijo activo (o tema activo). Debería funcionar correctamente.
