web-dev-qa-db-fra.com

WooCommerce get_sku (); sur les variations de produits dans l'ordre

Je construis une fonction personnalisée pour Woocommerce où je dois obtenir le SKU du produit et si le produit 'variation' obtient le SKU spécifique à la variation. 

Ce que j'ai actuellement est la suivante:

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

Cela fonctionne bien, sauf quand il s’agit de variations, j’ai passé beaucoup de temps à essayer de comprendre cela et de trouver une bonne réponse sans succès. 

J'arrive à comprendre que je devrais utiliser quelque chose comme ceci:

$available_variations = $product->get_available_variations();

Ce qui est fou, c’est que j’ai fonctionné mais que je n’ai pas fait de commit Git, je ne suis donc pas en mesure de récupérer le code correct. Je trouve que tous les exemples de code sont nombreux, mais je suis sûr que cela peut être fait avec une méthode beaucoup plus simple et plus performante.

13
Mathias Asberg

Parlez de la vision de tunnel .. 

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

La solution changeait 'product_id' pour mon 'variation_id' déjà en place

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

Voilà, le problème est résolu!

Exemple de travail Pour obtenir le résultat attendu sur $sku, j’ai choisi cette 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();
}
24
Mathias Asberg

Sur WooCommerce 3.x cette ligne génère une erreur fatale:

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

Exception non capturée 'Exception' avec le message 'Produit non valide'.

Tu peux le faire:

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

J'ai trouvé ce lien suivant extrêmement utile car il ajoute le SKU à la méta de l'article de commande, ce qui évite d'avoir à appeler des fonctions supplémentaires.

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

1
MikeeeGeee