Get the selected variation attributes from orders in Woocommerce 3 Get the selected variation attributes from orders in Woocommerce 3 wordpress wordpress

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;        }      }   }