Come ottenere la variazione selezionata di WooCommerce dall'oggetto ordine
Sto cercando di ottenere la variazione selezionata dall'ordine.
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' );
}
}
Ma questo ottiene tutti i valori delle variazioni. Voglio ottenere solo quella selezionata.

Segui il codice qui sotto secondo le tue esigenze
Per ottenere gli attributi della variazione selezionata utilizzando il metodo get_variation_attributes( ).
// Ottieni un'istanza dell'oggetto WC_Order da un ID ordine
$order = wc_get_order( $order_id );
// Scorri gli "elementi" dell'ordine
foreach( $order->get_items() as $item_id => $item ){
$product_id = $item->get_product_id(); //Ottieni l'ID del prodotto
$quantity = $item->get_quantity(); //Ottieni la quantità del prodotto
$product_name = $item->get_name(); //Ottieni il nome del prodotto
// Ottieni un'istanza dell'oggetto WC_Product (può essere anche una variazione di prodotto)
$product = $item->get_product();
// Ottieni la descrizione del prodotto (funziona anche per le variazioni di prodotto)
$description = $product->get_description();
// Solo per variazioni di prodotto
if( $product->is_type('variation') ){
// Ottieni gli attributi della variazione
$variation_attributes = $product->get_variation_attributes();
// Scorri ogni attributo selezionato
foreach($variation_attributes as $attribute_taxonomy => $term_slug ){
// Ottieni il nome dell'attributo del prodotto o la tassonomia
$taxonomy = str_replace('attribute_', '', $attribute_taxonomy );
// Il nome dell'etichetta dall'attributo del prodotto
$attribute_name = wc_attribute_label( $taxonomy, $product );
// Il nome del termine (o valore) da questo attributo
if( taxonomy_exists($taxonomy) ) {
$attribute_value = get_term_by( 'slug', $term_slug, $taxonomy )->name;
} else {
$attribute_value =
$term_slug; // Per attributi personalizzati del prodotto
}
}
}
}

Penso che ciò di cui hai bisogno sia il seguente codice:
$get_order = wc_get_order( $order_id );
$items = $get_order->get_items();
foreach ( $items as $item ) {
$product = $item->get_product();
//verifica se si tratta di una variazione 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 ) {
// qui puoi fare ciò che vuoi
}
}
}
}
Questo codice esamina ogni elemento dell'ordine e verifica se si tratta di una variazione. Se lo è, ottiene l'ID della variazione e da lì recupera gli attributi della variazione, permettendoti di scorrere ciascuno di essi per trovare quello che ti serve.
Ecco anche un altro modo per verificare se un elemento è variabile. In questo modo ottieni l'ID della variazione se presente.
$variation_id = $item->get_variation_id();
if(! empty($variation_id) {
// l'elemento è variabile e possiamo controllare la sua variazione
}
So che è una domanda vecchia, ma spero che questo possa essere utile per chiunque capiti qui.
