2016-11-23 4 views
2

Ich muss jeden Produktverkaufsbericht basierend auf dem Datenbereich erhalten. Das heißt, ich gebe die Produkt-ID (oder IDs) sowie das Startdatum und das Enddatum ein und die Funktion gibt mir die Anzahl der Verkäufe dieses Produkts innerhalb dieses (Startdatum und Enddatum) Zeitraums zurück. Also habe ich es mit WC_Admin_Report und WC_Report_Sales_By_Product versucht. Meine versucht Code ist-WooCommerce Admin Reports: Holen Sie sich einen benutzerdefinierten Produktbericht basierend auf dem Datumsbereich

function the_dramatist_get_report(){ 

    include_once(WP_PLUGIN_DIR . '/woocommerce/includes/admin/reports/class-wc-admin-report.php'); 
    include_once(WP_PLUGIN_DIR . '/woocommerce/includes/admin/reports/class-wc-report-sales-by-product.php'); 

    $reports = new WC_Report_Sales_By_Product(); 
    $reports->start_date = strtotime('2016-11-11'); 
    $reports->end_date = strtotime('2016-11-22'); 

    $reports->product_ids = 15; 

    $total_items = absint($reports->get_order_report_data(array(
     'data' => array(
      '_qty' => array(
       'type'   => 'order_item_meta', 
       'order_item_type' => 'line_item', 
       'function'  => 'SUM', 
       'name'   => 'order_item_count' 
      ) 
     ), 
     'where_meta' => array(
      'relation' => 'OR', 
      array(
       'type'  => 'order_item_meta', 
       'meta_key' => array('_product_id', '_variation_id'), 
       'meta_value' => $reports->product_ids, 
       'operator' => 'IN' 
      ) 
     ), 
     'query_type' => 'get_var', 
     'filter_range' => true 
    ))); 
    return $total_items; 
} 

Aber der obige Code zurückkehrt 0, wenn ich bereits getestet haben, dass es 1 sein sollte. Es wäre also besser, wenn du mir bei diesem Problem hilfst.

Wenn Sie eine andere Idee haben, um diese Aufgabe zu erledigen, zögern Sie nicht zu teilen.

Antwort

0

Nach vielen Versuchen habe ich diese Klasseninstanz nicht zum Laufen gebracht. Also folgte ich der ältesten CRUD-Technik, um das zu lösen (Was eigentlich diese Klasse auch macht), habe ich meine eigene SQL Abfrage geschrieben. Diese Klasse macht dies auch.Es funktioniert irgendwie wie WooCommerce Query Builder. Durch die Art und Weise gelöst der unter SQL Code meine Problem-

SELECT order_item_meta__product_id.meta_value AS product_id, 
     Sum(order_item_meta__qty.meta_value) AS order_item_count 
FROM wp_posts AS posts 
     INNER JOIN wp_woocommerce_order_items AS order_items 
       ON posts.id = order_items.order_id 
     INNER JOIN wp_woocommerce_order_itemmeta AS order_item_meta__qty 
       ON (order_items.order_item_id = 
        order_item_meta__qty.order_item_id) 
        AND (order_item_meta__qty.meta_key = '_qty') 
     INNER JOIN wp_woocommerce_order_itemmeta AS order_item_meta__product_id 
       ON (order_items.order_item_id = order_item_meta__product_id.order_item_id) 
        AND (order_item_meta__product_id.meta_key = '_product_id') 
     INNER JOIN wp_woocommerce_order_itemmeta AS 
        order_item_meta__product_id_array 
       ON order_items.order_item_id = order_item_meta__product_id_array.order_item_id 
WHERE posts.post_type IN ('shop_order', 'shop_order_refund') 
     AND posts.post_status IN ('wc-completed', 'wc-processing', 'wc-on-hold') 
     AND posts.post_date >= '2016-11-15' 
     AND posts.post_date < '2016-11-24' 
     AND ((order_item_meta__product_id_array.meta_key IN ('_product_id', '_variation_id') 
     AND order_item_meta__product_id_array.meta_value IN ('15'))) 
GROUP BY product_id 

Hoffnung, die Ihnen auch helfen.

2

WooCommerce Auftrag in Wordpress als Beitrag behandelt. So ist das Bestelldatum gespeichert in wp_posts.post_date mit wp_posts.post_type = shop_order.

So zuerst alle Bestellung in einem bestimmten Zeitraum, dann überprüfen Sie die Produkt-ID aus der Position in diesen Bestellungen. Hier

ist der Code:

function getproductReportbyDateRange($start_date, $end_date, $product_ids = []) 
{ 
    $totalProduct = []; 
    foreach ($product_ids as $product_id) 
    { 
     $totalProduct[$product_id] = 0; 
    } 
    unset($product_id); 
    $args = array(
     'post_type' => 'shop_order', //WooCommerce Order Status. 
     'post_status' => array('wc-completed'), //list of WooCommerce order status. 
     'posts_per_page' => -1, 
     'date_query' => array(
      array(
       'after' => $start_date, 
       'before' => $end_date, 
       'inclusive' => true, 
      ), 
     ), 
    ); 
    $query = new WP_Query($args); 
    //print_r($query->posts); 
    //die; 
    if (isset($query->posts)) 
    { 
     foreach ($query->posts as $post) 
     { 
      $order = new WC_Order($post->ID); 
      $items = $order->get_items(); 
      foreach ($items as $item) 
      { 
       //$product_name = $item['name']; 
       $product_id = $item['product_id']; 
       //$product_variation_id = $item['variation_id']; 
       if (in_array($product_id, $product_ids)) 
       { 
        $totalProduct[$product_id] = $totalProduct[$product_id] + $item['qty']; 
       } 
      } 
     } 
    } 
    return $totalProduct; 
} 

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

USAGE

Um die Anzahl der Produkte für ein einzelnes Produkt zu erhalten

getproductReportbyDateRange('2016-11-11','2016-11-22',[37]); 

Um die Anzahl der Produkte für mehrere Produkt zu erhalten

getproductReportbyDateRange('2016-11-11','2016-11-22',[37, 53]); 

Der Code ist getestet und voll funktionsfähig.


Referenz:

+0

Testen Sie diesen Code bitte erneut? Weil ich sehe, dass es viele Fehler gibt. Nach 'foreach ($ items as $ item)' 'hast du' $ product_id = $ item ['product_id'] '' 'aufgerufen, was einen Fehler verursacht. Danach haben Sie '$ ctr' überprüft und inkrementiert. Aber in einer Bestellung kann jeder mehr als einen kaufen. Was wird dann passieren? Überprüfen Sie den Code erneut. @ Raunak Gupta –

+0

@the_dramatist: Ja, ich habe den Code getestet es funktioniert gut, ohne Fehler. und ja, ich habe die "Menge" vergessen, ich habe meine Antwort aktualisiert. –

+0

@the_dramatist: Hast du meine Antwort versucht? –

Verwandte Themen