Woocommerce SQL-Abfrage, um Produkte anzuzeigen, die diese Woche verkauft wurden?

Lesezeit: 5 Minuten

Woocommerce hat ein Reporting-Tool, das mir die Top-Produkte anzeigt, die in den letzten 7 Tagen verkauft wurden. Aber es zeigt nur die Top 12 Produkte.

Ich möchte eine SQL-Abfrage erstellen, die mir alle Produkte mit ihrer Gesamtzahl der Verkäufe der letzten 7 Tage anzeigt, anstatt nur die Top 12.

Hat das schon mal jemand gemacht?

  • Geben Sie Ihre Tabellenstruktur an.

    – Thit Lwin Oo

    6. März 2014 um 17:18 Uhr

WooCommerce lehnt sich stark an die Art und Weise an, wie WordPress selbst Daten speichert: Ein Post dient als grundlegendes Datenobjekt mit einer Handvoll Spalten, die allen benutzerdefinierten Posts gemeinsam sind. Alle eindeutigen Daten, die für einen benutzerdefinierten Typ spezifisch sind, werden als Schlüsselwertpaare in post_meta gespeichert. Das bedeutet, dass es keine sauberen Spalten oder Tabellen gibt, die nach Dingen wie Bestellposten, SKU, Einzelpostenpreis usw. abgefragt werden können.

Es ist erwähnenswert, dass WC für Bestellungen nicht speichert Produkte Es speichert Werbebuchungen. Dies liegt daran, dass Sie einer Bestellung Gebühren, generische Werbebuchungen und möglicherweise andere Dinge hinzufügen können, die keine Produkte sind. Außerdem muss WC den Preis zum Zeitpunkt der Bestellung speichern, da der Kunde möglicherweise einen Rabatt erhalten hat oder sich der Produktpreis geändert hat.

WooCommerce verwendet sowohl die WordPress Postmeta-Tabelle als auch seine eigene order_itemmeta-Tabelle. So gliedert sich das auf:

  • Die Bestellung selbst wird als benutzerdefinierter Beitragstyp „shop_order“ in der gespeichert wp_posts Tisch
  • Auftragseinzelposten werden in einer Beziehungstabelle namens gespeichert wp_woocommerce_order_items
  • Auftragsartikeldetails werden als Schlüsselwertpaare in gespeichert wp_woocommerce_order_itemmeta
  • Abschließend werden Bestelldaten in der gespeichert wp_postmeta Tisch

Nehmen wir also an, Sie möchten alle Werbebuchungen für einen bestimmten Zeitraum anzeigen und möchten Dinge wie den Artikeltitel, den Preis und die Bestellung wissen, zu der er gehört. Dazu müssen Sie mehrere Tabellen VERKNÜPFEN und die Metatabellen für die gewünschten Felder entweder VERKNÜPFEN oder unterabfragen. Im folgenden Beispiel habe ich Unterabfragen verwendet, weil ich glaube, dass sie besser lesbar sind. Bitte beachten Sie, dass JOINs sehr wahrscheinlich schneller sind.

SELECT
-- Choose a few specific columns related to the order
o.ID as order_id,
o.post_date as order_created,

-- These come from table that relates line items to orders
oi.order_item_name as product_name,
oi.order_item_type as item_type,

-- We have to subquery for specific values and alias them. This could also be done as a join
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_product_id") as product_id,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_product_variation_id") as variant_id,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_qty") as qty,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_fee_amount") as fee,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_line_subtotal") as subtotal,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_line_subtotal_tax") as tax,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_line_total") as total,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_tax_class") as tax_class,
(SELECT meta_value FROM wp_woocommerce_order_itemmeta WHERE order_item_id = oi.order_item_id AND meta_key = "_tax_status") as tax_status,

-- This wasn't specifically mentioned in the question but it might be nice to have some order meta data too
(SELECT meta_value FROM wp_postmeta WHERE post_id = o.ID AND meta_key = "_order_total") as order_total,
(SELECT meta_value FROM wp_postmeta WHERE post_id = o.ID AND meta_key = "_customer_user") as user_id

FROM wp_posts o
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_id = o.id
LEFT JOIN wp_posts p ON p.ID = oi.order_item_id
WHERE o.post_type = "shop_order"

Wie Sie sehen können, ist eine Unterabfrage/Join erforderlich jeden Positionsfeld, das Sie möchten, was diese Abfragen ziemlich teuer macht. Ich vermute, dass WC aus diesem Grund begrenzt, wie viel für Berichte abgefragt wird.

Diese Antwort wurde gegen WC-Version 3.3.4 getestet.

  • Mir ist gerade aufgefallen, dass ich dort einen zweiten Join der Posts-Tabelle mit dem Alias ​​”p” für “product” hinterlassen habe. Aber ich habe eigentlich keine Felder ausgewählt. Dieser Join dient zum Abrufen von Produktdaten, wenn es sich bei der Werbebuchung um ein Produkt handelt. Sie können Ihre Auswahl erweitern, um weitere Produktdaten aus dieser Verknüpfung einzubeziehen.

    – profexorgeek

    3. August 2018 um 14:59 Uhr

  • Was für ein toller Einsatz 👏

    – Omer

    3. September 2022 um 12:31 Uhr

Anstatt eine neue Abfrage zu schreiben, ändern Sie einfach die vorhandene mit dem Filter:

woocommerce_reports_get_order_report_query

Anscheinend ist das Limit für alle Teile der Berichtsseite gleich, daher wirkt sich eine Änderung auf alle Abfragen mit Limit-Klausel aus. Ich würde mit der Anzahl der Produkte nicht zu weit gehen, da für jedes aufgelistete Produkt eine neue SQL-Abfrage ausgeführt wird.

add_filter( 'woocommerce_reports_get_order_report_query', function( $query ) 
{
    if ( isset( $query['limit'] ) ) $query['limit'] = 'LIMIT 20';  <-- set limit to 20 products
    return $query;  
});

Benutzeravatar von Mihai
Mihai

Nur eine Vermutung

....WHERE dateColumn BETWEEN DATE_SUB(NOW(),INTERVAL 1 WEEK) AND NOW()

Fügen Sie weitere Informationen hinzu, um eine genauere Antwort zu erhalten.

  • Woher wissen Sie, dass dies die Antwort auf die Frage ist? Wenn Sie zusätzliche Informationen benötigen, fragen Sie.

    – gunr2171

    6. März 2014 um 17:42 Uhr

1442530cookie-checkWoocommerce SQL-Abfrage, um Produkte anzuzeigen, die diese Woche verkauft wurden?

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

Privacy policy