WooCommerce get_sku(); auf produkt variationen in auftrag

Lesezeit: 4 Minuten

Benutzeravatar von Mathias Asberg
Matthias Asberg

Ich baue eine benutzerdefinierte Funktion für Woocommerce, bei der ich die Produkt-SKU abrufen muss, und wenn das Produkt „Variante“ eine variantenspezifische SKU erhält.

Was ich aktuell habe ist folgendes:

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

Es funktioniert gut, außer wenn es um Variationen geht. Ich habe viel Zeit damit verbracht, dies herauszufinden und ohne Erfolg eine gute Antwort zu finden.

Ich komme zu verstehen, dass ich so etwas verwenden sollte:

$available_variations = $product->get_available_variations();

Das Verrückte ist, dass ich das funktioniert habe, aber ich habe kein Git-Commit gemacht, daher kann ich den richtigen Code nicht wiederherstellen. Alle Beispiele, die ich gefunden habe, bestehen aus ziemlich viel Code, aber ich bin sicher, dass dies mit einer viel einfacheren und leistungsfähigeren Methode erreicht werden kann.

Benutzeravatar von Mathias Asberg
Matthias Asberg

Apropos Tunnelblick..

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

Die Lösung bestand darin, ‘product_id’ gegen meine bereits vorhandene ‘variation_id’ auszutauschen.

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

Voila, Problem gelöst!

Arbeitsbeispiel
Um die erwartete Ausgabe zu erhalten $sku Ich habe mich für diese Lösung entschieden

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

  • Sie können die ersetzen wenn Teil durch $product = $order->get_product_from_item( $item ); Siehe die Funktion get_product_from_item in /abstract-wc-order.php

    – jflamme

    22. September 2016 um 1:22 Uhr


  • schöne jubbly… @jflaflamme

    – dj.cowan

    15. Dezember 2016 um 22:40 Uhr

  • Sie können dies sogar verkürzen, indem Sie das Produkt so laden; $product = $item->get_product() Sie müssen weder if noch die variation_id überprüfen

    – Skatox

    31. Mai 2017 um 1:13 Uhr

  • Gibt es eine Möglichkeit, dies auf der Produktseite zu tun? Zeigt die ausgewählte Variations-SKU an, wenn sie ausgewählt ist, und nicht die Master-SKU

    – anthonytherockjohnson

    5. Juni 2017 um 8:04 Uhr

An WooCommerce 3.x Diese Zeile wirft einen schwerwiegenden Fehler:

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

Nicht erfasste Ausnahme „Exception“ mit der Meldung „Invalid Product“.

Du kannst das:

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

  • Dies sollte die Top-Antwort sein! Die jetzige ist veraltet.

    – René Olivo

    21. Juli 2017 um 21:25 Uhr

  • Verwenden Sie wc_get_product($id)

    – Tosch

    16. Februar 2019 um 15:31 Uhr

Benutzeravatar von MikeeeGeee
MikeeeGeee

Ich fand diesen folgenden Link äußerst hilfreich, da er die SKU zum Bestellartikel-Meta hinzufügt, sodass kein zusätzlicher Aufruf von Funktionen erforderlich ist.

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

  • auf meinem Handy, kann Ihnen also keine genaue Antwort geben, aber ich denke, das Problem könnte sein, dass Sie ‘global $products’ nicht eingeschlossen haben oder wenn es sich um globale $wc_products handelt, so ähnlich

    – Matthias Asberg

    6. Juli 2015 um 18:01 Uhr

  • Danke für deine Antwort. Ich habe das Global früher im Code deklariert. Ich habe eine andere Methode zum Abrufen der SKU verwendet. Verknüpfung Ich werde es meiner “Antwort” hinzufügen. Danke noch einmal.

    – MikeeeGeee

    7. Juli 2015 um 12:07 Uhr

  • ‘woocommerce_add_order_item_meta’ ist jetzt veraltete Funktion… Verknüpfung

    – dj.cowan

    15. Dezember 2016 um 6:48 Uhr

Getestet mit Woocommerce 3.8.1


// Define HERE the accepted statuses of that orders 
$order_statuses = array('wc-completed');

// Define HERE the customer ID
$customer_user_id = get_current_user_id(); // current user ID here for example

// Getting current customer orders
$customer_orders = wc_get_orders( array(
    'meta_key' => '_customer_user',
    'meta_value' => $customer_user_id,
    'post_status' => $order_statuses,
    'numberposts' => -1
) );   

// Loop through each customer WC_Order objects
foreach($customer_orders as $order ){

    $order = new WC_Order($order->get_id());
    $items = $order->get_items();

    // Loop through each item of the order
    foreach ( $items as $item ) {
        $product_variation_id = $item['variation_id'];

        if ($product_variation_id) { // IF Order Item is Product Variantion then get Variation Data instead
            $product = wc_get_product($item['variation_id']);
        } else {
            $product = wc_get_product($item['product_id']);
        }

        if ($product) { // Product might be deleted and not exist anymore    
            $sku = $product->get_sku();             
            echo "<p>SKU: " . $sku . "</p>";                
        }  
    }    
}

1402180cookie-checkWooCommerce get_sku(); auf produkt variationen in auftrag

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy