2017-08-23 2 views
2

Im WooCommerce API sehe ich eine Methode wc_get_ordersWooCommerce: Erhalten Sie alle Aufträge für ein Produkt

WooCommerce Order Functions

In der genannten args Ich habe kein Argument sehen, in dem ich eine Produkt-ID zur Verfügung stellen könnte oder das Objekt Begrenzen Sie die Auftragsergebnisse nur für dieses spezifische Produkt.

Gibt es eine Möglichkeit, Bestellungen nur für bestimmte Produkte zu filtern?

Ich brauche diese Methode zu verwenden, da einige Argumente erforderlich sind

+0

diese realen WC_Order Objekten https erhalten: // www .rfmeier.net/get-all-orders-fuer-ein-produkt-in-woocommerce/ –

Antwort

1

Edited Diese Funktion gibt es nicht, aber es kann gebaut werden. So unten die Funktion wird ein Array aller Aufträge IDs für ein bestimmtes Produkt ID zurückkehren, so dass die richtige SQL-Abfrage:

/** 
* Get All orders IDs for a given product ID. 
* 
* @param integer $product_id (required) 
* @param array $order_status (optional) Default is 'wc-completed' 
* 
* @return array 
*/ 
function get_orders_ids_by_product_id($product_id, $order_status = array('wc-completed')){ 
    global $wpdb; 

    $results = $wpdb->get_col(" 
     SELECT order_items.order_id 
     FROM {$wpdb->prefix}woocommerce_order_items as order_items 
     LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id 
     LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID 
     WHERE posts.post_type = 'shop_order' 
     AND posts.post_status IN ('" . implode("','", $order_status) . "') 
     AND order_items.order_item_type = 'line_item' 
     AND order_item_meta.meta_key = '_product_id' 
     AND order_item_meta.meta_value = '$product_id' 
    "); 

    return $results; 
} 

USAGE 1 (für ein bestimmtes Produkt ID 37 und Standard abgeschlossene Aufträge Status) :

$orders_ids = get_orders_ids_by_product_id(37); 

// The output (for testing) 
print_r($orders_ids); 

USAGE 2 (für eine ID Produkt gegeben 37 und einige definiert o rders Status):

// Set the orders statuses 
$statuses = array('wc-completed', 'wc-processing', 'wc-on-hold'); 

$orders_ids = get_orders_ids_by_product_id(37, $statuses); 

// The output (for testing) 
print_r($orders_ids); 

-Code geht in function.php Datei Ihres aktiven Kind Thema (oder Thema) oder auch in jeder Plugin-Datei.

Dieser Code wurde getestet und funktioniert.

+0

Hallo LoicTheAztec, wie ändere ich die SQL, wenn ich mehr als einen Metaschlüsselwert habe. Beispiel wie Farben> rot? Vielen Dank! – somtam

+0

@somtam Sie benötigen eine weitere hinzuzufügen: LEFT JOIN {$ wpdb-> prefix} woocommerce_order_itemmeta als order_item_meta2 ON order_items.order_item_id = order_item_meta2.order_item_id' ... dann werden Sie in der Lage sein, eine neue 'order_item_meta2.meta_key' zu verwenden, oder/und 'order_item_meta2.meta_value' ... – LoicTheAztec

+0

Es funktioniert perfekt, danke! Eine Sache noch. Normalerweise mit get_col() entkomme ich die sql, wie $ results = $ wpdb-> get_col ($ wpdb-> vorbereiten ($ sql, $ id)) ;. Muss ich das tun oder get_col selbst entkommen? Vielen Dank. – somtam

1

Also wollte ich Bestellungen für ein Produkt und eine Person abrufen. Ich habe die von @LoicTheActec gelieferte Lösung mit der wc_get_orders woocommerce-Methode verwendet, um das gewünschte Ergebnis zu erhalten.

Hier sind die Funktionen:

/** 
* Get All orders IDs for a given product ID. 
* 
* @param integer $product_id (required) 
* @param array $order_status (optional) Default is 'wc-completed' 
* 
* @return array 
*/ 
public function get_orders_ids_by_product_id($product_id, $order_status = array('wc-completed')) { 
    global $wpdb; 

    $results = $wpdb->get_col(" 
     SELECT order_items.order_id 
     FROM {$wpdb->prefix}woocommerce_order_items as order_items 
     LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id 
     LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID 
     WHERE posts.post_type = 'shop_order' 
     AND posts.post_status IN ('" . implode("','", $order_status) . "') 
     AND order_items.order_item_type = 'line_item' 
     AND order_item_meta.meta_key = '_product_id' 
     AND order_item_meta.meta_value = '$product_id' 
    "); 

    return $results; 
} 

Um die Ergebnisse herauszufiltern ich will. Da das Verfahren ein Argument enthält nicht bieten hatte ich alle Aufträge zu packen und dann den Auftrag für die gegebene Produkt-ID entfernen und alle übrigen von wc_get_orders auszuschließen:

/** 
* Check if current user has more than 3 orders 
* 
* @return void 
* @author 
**/ 
public function woocommerce_check_order_count($product_id, $customer_email) 
{ 


    $statuses = array( 'wc-processing'); 

    $orders_ids_for_product = $this->get_orders_ids_by_product_id($product_id, $statuses); 


    // Get All Orders 
    $allorders = wc_get_orders(array(
     'status'  => 'processing', 
     'type'  => 'shop_order', 
     'email'  => '', 
     'limit'  => -1, 
     'return'  => 'ids', 
    )); 

    // Remove the $orders_ids_for_product array from the $allorders array 
    $orderstoexclude = array_diff($allorders, $orders_ids_for_product); 

    $orders = wc_get_orders(array(
     'status'  => 'processing', 
     'type'  => 'shop_order', 
     'customer' => $customer_email, 
     'email'  => '', 
     'limit'  => 3, 
     'exclude'  => $orderstoexclude, 
     'return'  => 'ids', 
    )); 

    return $orders; 

} 
Verwandte Themen