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.
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();
}
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 );
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/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With