WooCommerce get_sku(); по вариантам продукции в порядке

Я создаю пользовательскую функцию для Woocommerce, где мне нужно получить SKU продукта, и если "вариационный" продукт получит специфический для SKU вариант.

В настоящее время у меня есть следующее:

// 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();

Он работает хорошо, кроме случаев, когда дело доходит до вариаций, я потратил много времени, пытаясь понять это и найти хороший ответ без каких-либо успехов.

Я понял, что должен использовать что-то вроде этого:

$available_variations = $product->get_available_variations();

Сумасшедшая вещь заключается в том, что у меня была эта работа, но я не сделал фиксацию Git, поэтому я не могу вернуть правильный код. Все примеры, которые я нашел довольно много, содержат много кода, но я уверен, что это можно сделать, используя гораздо более простой и эффективный способ.

Ответ 1

Разговор о туннельном видении.

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

Решение переключило 'product_id' на мой уже установленный вариант 'variant_id'

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

Voila, проблема решена!

Рабочий пример Чтобы получить ожидаемый результат на $sku, я сделал это решение

// 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();
}

Ответ 2

В WooCommerce 3.x эта строка вызывает фатальную ошибку:

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

Отключить исключение "Исключение" с сообщением "Недействительный продукт".

Вы можете сделать это:

$sku = get_post_meta( $item['variation_id'], '_sku', true );