Get the selected variation attributes from orders in Woocommerce 3
2020 Update - Handling "Custom Product Attributes" (revamped code)
The WC_Product method get_variation_description()
is outdated and deprecated. It's replaced by get_description()
method. So you need to get the WC_Product
object first.
To get the selected variation attributes, you will use
get_variation_attributes( )
method.
// Get an instance of the WC_Order object from an Order ID $order = wc_get_order( $order_id ); // Loop though order "line items"foreach( $order->get_items() as $item_id => $item ){ $product_id = $item->get_product_id(); //Get the product ID $quantity = $item->get_quantity(); //Get the product QTY $product_name = $item->get_name(); //Get the product NAME // Get an instance of the WC_Product object (can be a product variation too) $product = $item->get_product(); // Get the product description (works for product variation too) $description = $product->get_description(); // Only for product variation if( $product->is_type('variation') ){ // Get the variation attributes $variation_attributes = $product->get_variation_attributes(); // Loop through each selected attributes foreach($variation_attributes as $attribute_taxonomy => $term_slug ){ // Get product attribute name or taxonomy $taxonomy = str_replace('attribute_', '', $attribute_taxonomy ); // The label name from the product attribute $attribute_name = wc_attribute_label( $taxonomy, $product ); // The term name (or value) from this attribute if( taxonomy_exists($taxonomy) ) { $attribute_value = get_term_by( 'slug', $term_slug, $taxonomy )->name; } else { $attribute_value = $term_slug; // For custom product attributes } } }}
Tested and works for a product variation as all other product types…
It works perfectly to display order item name and attributes key
foreach( $order->get_items() as $order_item_product ) { $item_meta_data = $order_item_product->get_meta_data(); echo $product_name = $order_item_product->get_name(); echo '<br>'; foreach( $item_meta_data as $meta_data ) { $meta_data_as_array = $meta_data->get_data(); echo $meta_data_as_array['key'].': '.$meta_data_as_array['value'].'<br>'; }}
Based on the accepted answer This is so that the typo could be corrected ( i don't have the reputation to do anything else).notice the $term_slug on the $attribute_value property definition. that is what was missing the $.
// Get an instance of the WC_Order object from an Order ID $order = wc_get_order( $order_id ); // Loop though order "line items" foreach( $order->get_items() as $item_id => $item_product ){ $product_id = $item_product->get_product_id(); //Get the product ID $quantity = $item_product->get_quantity(); //Get the product QTY $product_name = $item_product->get_name(); //Get the product NAME // Get an instance of the WC_Product object (can be a product variation too) $product = $item_product->get_product(); // Get the product description (works for product variation) $description = $product->get_description(); // Only for product variation if($product->is_type('variation')){ // Get the variation attributes $variation_attributes = $product->get_variation_attributes(); // Loop through each selected attributes foreach($variation_attributes as $attribute_taxonomy => $term_slug){ $taxonomy = str_replace('attribute_', '', $attribute_taxonomy ); // The name of the attribute $attribute_name = get_taxonomy( $taxonomy )->labels->singular_name; // The term name (or value) for this attribute $attribute_value = get_term_by( 'slug', $term_slug, $taxonomy )->name; } } }