2017-03-01 1 views
4

Comment puis-je répertorier les articles de commande en fonction d'une variante de produit spécifique?Recevez des commandes WooCommerce Articles par ID de variante

Etant donnée une ID de variation, je voudrais générer une liste de tous les éléments de commande qui incluent cette variation particulière. Dans mon cas, j'utilise des variations pour représenter les dates et le produit lui-même est un événement récurrent, donc le but de ceci est d'énumérer les personnes qui assistent à cette date spécifique.

Ce serait incroyable si cela pouvait être accompli par quelque chose de simple comme get_posts en utilisant meta_keys ou quelque chose comme ça, mais sinon, je suppose qu'une requête personnalisée serait le chemin.

Je n'arrive pas à comprendre comment les tables se rapportent dans ce cas ou si elles sont stockées de manière interrogeable.

Toute aide très appréciée.

Merci!

Répondre

2

Il y a plusieurs façons d'accomplir cela. Ici, je l'utilise dans une fonction personnalisée avec une requête SQL et un $variation_id(l'ID de variation de mettre en) comme paramètre dans le:

function get_all_orders_items_from_a_product_variation($variation_id){ 

    global $wpdb; 

    // Getting all Order Items with that variation ID 
    $item_ids_arr = $wpdb->get_col($wpdb->prepare(" 
     SELECT `order_item_id` 
     FROM {$wpdb->prefix}woocommerce_order_itemmeta 
     WHERE meta_key LIKE '_variation_id' 
     AND meta_value = %s 
    ", $variation_id)); 

    return $item_ids_arr; // return the array of orders items ids 

} 

du code dans le fichier function.php de votre enfant actif thème (ou thème) ou aussi dans n'importe quel fichier plugin.

USAGES(ici avec la variation ID 41 par exemple):

Cela permet d'afficher une liste d'éléments commandes ID pour cet ID de variation avec des données (par exemple).

$items_ids = get_all_orders_items_from_a_product_variation(41); 

// Iterating through each order item 
foreach($items_ids as $item_id){ 

    // Getting some data (the color value here) 
    $item_color = wc_get_order_item_meta($item_id, 'pa_color', true); 

    // Displaying some data related to the current order item 
    echo 'Item ID: '. $item_id . ' with color "' . $item_color .'"<br>'; 
} 

Ce code a été testé et fonctionne.


OBTENIR L'ID DE COMMANDE(MISE À JOUR)

Maintenant, si vous avez besoin pour obtenir tous les ID Commandes à la place, vous pouvez utiliser une autre requête dans cette fonction de cette façon:

function get_all_orders_that_have_a_product_variation($variation_id){ 

    global $wpdb; 

    // Getting all Order IDs with that variation ID 
    $order_ids_arr = $wpdb->get_col($wpdb->prepare(" 
     SELECT DISTINCT items.order_id 
     FROM {$wpdb->prefix}woocommerce_order_items AS items 
     LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta ON items.order_item_id = itemmeta.order_item_id 
     WHERE meta_key LIKE '_variation_id' 
     AND meta_value = %s 
    ", $variation_id)); 

    return $orders_ids; // return the array of orders ids 

} 

Le code va dans le fichier function.php de votre actif thème enfant (ou thème) ou également dans un fichier plugin.

USAGES(ici toujours avec la variation ID 41 par exemple):

Cela permet d'afficher une liste d'ID de commandes pour cet ID de variation avec leur statut (par exemple).

$orders_ids = get_all_orders_that_have_a_product_variation(41); 

// Iterating through each order item 
foreach($orders_ids as $order_id){ 

    // Getting an instance of the order object 
    $order = wc_get_order($order_id); 

    // Displaying some data related to the current order 
    echo 'Order #'. $order_id . ' has status "' . $order->get_status() .'"<br>'; 
} 

Ce code a été testé et fonctionne.

Vous pouvez également combiner dans un tableau plus complexe, l'ID de commande avec elle est liée Articles ID dans un tableau multidimensionnel de cette façon:

function get_all_orders_and_item_ids_that_have_a_product_variation($variation_id){ 

    global $wpdb; 

    // Getting all Order IDs and item ids with that variation ID 
    $results = $wpdb->get_results($wpdb->prepare(" 
     SELECT items.order_id, items.order_item_id AS item_id 
     FROM {$wpdb->prefix}woocommerce_order_items AS items 
     LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta ON items.order_item_id = itemmeta.order_item_id 
     WHERE meta_key LIKE '_variation_id' 
     AND meta_value = %s 
    ", $variation_id), ARRAY_A); 

    return $results; // return a multi-dimensional array of orders Ids/items Ids 

} 
+0

Merci beaucoup pour la réponse complète! J'ai fini par utiliser une combinaison de votre deuxième fonction et des fonctions WC pour étoffer les données, mais je vais vérifier si je peux optimiser mais obtenir tout de la requête. – Simon

+0

Ne fonctionne pas pour moi, Peut-être un problème de version? Obtenir un tableau vide seulement. –

+0

J'ai essayé d'ajouter des ID de commande, utilisé la deuxième fonction avec un préfixe personnalisé mais pas de chance. C'est juste un tableau vide. Même essayé de vérifier la fonction, puis trouvé 'item_ids_arr' montre tableau vide. –

0

J'ai essayé de faire la même chose, après regardant db je recevais 0 devant '_variation_id'. Mais j'ai obtenu les articles de commandes en utilisant mon hack personnalisé pour les futurs utilisateurs qui cherchent le même problème. Nous devons comparer l'utilisation product_name, variaion_name comme la taille, etc. Et variation_value LIKE « S », « L » etc. Considérez cette fonction:

function get_all_orders_that_have_a_product_variation($product_name, $variation_name, $variation_value){ 

global $wpdb; 
// Getting all Order IDs with that variation ID 

$order_ids_arr = $wpdb->get_col($wpdb->prepare (" 
     SELECT * FROM wpcc_woocommerce_order_items items 
     LEFT JOIN wpcc_woocommerce_order_itemmeta itemmeta ON items.order_item_id = itemmeta.order_item_id 
     WHERE items.order_item_name LIKE %s 
     AND itemmeta.meta_key LIKE %s 
     AND itemmeta.meta_value = %s", $product_name, $variation_name, $variation_value)); 


return $order_ids_arr; // return the array of orders ids 

} 

appeler Maintenant, dire notre nom du produit est Raleigh sport, le nom de variation est size et la valeur est s. En forme simple, nous voulons obtenir les éléments de commande identifiant du produit dont le nom est Raleigh sport et nous voulons chercher seulement dont size est S

simple appel par fonction:

print_r(get_all_orders_that_have_a_product_variation("Raleigh Sport", "Size", "S"));

merci.