Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WooCommerce get_sku(); on products variations in order

I'm building a custom function for Woocommerce where I need to get product SKU and if 'variation' product get variation specific SKU.

What I currently have is the following:

// Query order data
$order = new WC_Order($order_id);
$items = $order->get_items();

// Output the loop
foreach ($order->get_items() as $item) {
    // Getting some information
    $product_name = $item['name'];
    $product_id = $item['product_id'];
    $product_qty = $item['qty'];
    $product_variation_id = $item['variation_id'];
    $product = new WC_Product($item['product_id']);
    // SKU
    $SKU = $product->get_sku();

It works good except when it comes to variations, I Have spent much time trying to figure this out and to find a good answer without any succes.

I come to understand that I should use something like this:

$available_variations = $product->get_available_variations();

The crazy thing is that I did have this working but I didn't made a Git commit, thus I'm not able to revert the correct code. All the examples I found pretty much exist of a lot of code, but I'm sure this can be done using a much simpler and better performing method.

like image 613
Mathias Asberg Avatar asked Feb 22 '15 20:02

Mathias Asberg


3 Answers

Talk about tunnel vision..

 $product_variation_id = $item['variation_id'];
 $product = new WC_Product($item['product_id']);

Solution was switching 'product_id' for my already in place 'variation_id'

$product = new WC_Product($item['variation_id']);

Voila, problem solved !

Working example To get the expected output on $sku i did go for this solution

// Get order data
$order = new WC_Order($order_id);
$items = $order->get_items();

// Loop through ordered items
foreach ($items as $item) {
  $product_name = $item['name'];
  $product_id = $item['product_id'];
  $product_qty = $item['qty'];
  $product_variation_id = $item['variation_id'];

  // Check if product has variation.
  if ($product_variation_id) { 
    $product = new WC_Product($item['variation_id']);
  } else {
    $product = new WC_Product($item['product_id']);
  }

  // Get SKU
  $sku = $product->get_sku();
}
like image 65
Mathias Asberg Avatar answered Oct 23 '22 17:10

Mathias Asberg


On WooCommerce 3.x this line throws a fatal error:

$product = new WC_Product($item['variation_id']);

Uncaught exception 'Exception' with message 'Invalid Product'.

You can do this:

$sku = get_post_meta( $item['variation_id'], '_sku', true );
like image 18
Mike Avatar answered Oct 23 '22 16:10

Mike


I found this following link massively helpful as adds the SKU to the order item meta so no need for extra calling of functions.

https://majemedia.com/woocommerce-save-item-sku-to-order-item-meta-for-historical-reference/

like image 1
MikeeeG Avatar answered Oct 23 '22 17:10

MikeeeG