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?
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.
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;
});
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.
Geben Sie Ihre Tabellenstruktur an.
– Thit Lwin Oo
6. März 2014 um 17:18 Uhr