Cómo obtener la variación seleccionada de WooCommerce desde el objeto de pedido
Estoy intentando obtener la variación seleccionada de un pedido.
global $order;
$items = $order->get_items();
foreach( $items as $item ) {
$product_id = $item->get_product_id();
$product = wc_get_product( $product_id );
if( $product->is_type( 'variable' ) ) {
$variationName = $product->get_attribute( 'pa_my-custom-variation' );
}
}
Pero esto obtiene todos los valores de variación. Yo quiero obtener solo el seleccionado.

A continuación, el código adaptado según tus necesidades
Para obtener los atributos de variación seleccionados usando el método get_variation_attributes( ).
// Obtener una instancia del objeto WC_Order desde un ID de pedido
$order = wc_get_order( $order_id );
// Recorrer los "elementos" del pedido
foreach( $order->get_items() as $item_id => $item ){
$product_id = $item->get_product_id(); //Obtener el ID del producto
$quantity = $item->get_quantity(); //Obtener la cantidad del producto
$product_name = $item->get_name(); //Obtener el nombre del producto
// Obtener una instancia del objeto WC_Product (puede ser una variación de producto también)
$product = $item->get_product();
// Obtener la descripción del producto (funciona también para variaciones de producto)
$description = $product->get_description();
// Solo para variaciones de producto
if( $product->is_type('variation') ){
// Obtener los atributos de la variación
$variation_attributes = $product->get_variation_attributes();
// Recorrer cada atributo seleccionado
foreach($variation_attributes as $attribute_taxonomy => $term_slug ){
// Obtener el nombre del atributo del producto o la taxonomía
$taxonomy = str_replace('attribute_', '', $attribute_taxonomy );
// El nombre de la etiqueta del atributo del producto
$attribute_name = wc_attribute_label( $taxonomy, $product );
// El nombre del término (o valor) de este atributo
if( taxonomy_exists($taxonomy) ) {
$attribute_value = get_term_by( 'slug', $term_slug, $taxonomy )->name;
} else {
$attribute_value =
$term_slug; // Para atributos personalizados de producto
}
}
}
}

Lo que necesitas creo que es el siguiente código:
$get_order = wc_get_order( $order_id );
$items = $get_order->get_items();
foreach ( $items as $item ) {
$product = $item->get_product();
//verificar si es una variación usando is_type
if ( 'variation' === $product->get_type() ) {
$variation_id = $item->get_variation_id();
$variation = new WC_Product_Variation( $variation_id );
$attributes = $variation->get_attributes();
foreach ( $attributes as $key => $value ) {
if ( 'pa_my-custom-variation' === $key ) {
// lo que quieras hacer a continuación
}
}
}
}
Lo que hace es revisar cada artículo del pedido y verificar si es realmente una variación. Si lo es, obtendrá su ID de variación y desde ahí obtendrá los atributos de la variación y podrás iterar a través de cada uno de ellos para encontrar el que necesitas.
Aquí hay otra forma de verificar si un artículo es variable. De esta manera obtienes el ID de variación si existe uno.
$variation_id = $item->get_variation_id();
if(! empty($variation_id) {
// el artículo es variable y podemos verificar su variación
}
Sé que esta es una pregunta antigua pero espero que esto pueda ser útil para cualquiera que llegue aquí.
