SQL Select-Abfrage zum Abrufen von WooCommerce-Bestellpositionen und Metadaten

Lesezeit: 6 Minuten

Ich arbeite daran, einige SQL-Ansichten für meine WordPress-Datenbank zu erstellen, um Online-Bestellungen, die über das WooCommerce-Plugin generiert wurden, einfacher anzuzeigen. Ich kenne die WooCommerce-Struktur und wo die Daten gespeichert werden, aber als SQL-Neuling bleibe ich an der letzten Hürde hängen.

Ich konnte die erste Ansicht aller Bestelldetails mit dieser Referenz erstellen:

http://codecharismatic.com/sql-script-to-get-all-woocommerce-orders-inclusive-metadata/

Jetzt muss ich für jeden dieser Aufträge eine ähnliche Ansicht der Werbebuchungen erstellen. Es gibt 2 Tabellen, in denen Auftragsartikeldetails gespeichert werden:

wp_woocommerce_order_items wp_woocommerce_order_itemmeta

Ich konnte die grundlegende Liste der Datensätze aus der Tabelle wp_woocommerce_order_items wie folgt erstellen:

SELECT order_item_id,order_item_name,order_item_type,order_id
FROM ocm_woocommerce_order_items 
ORDER BY order_id

Dies gibt eine schöne Liste von Datensätzen wie diese zurück:

order_item_id   order_item_name order_item_type order_id
 2  Widgets line_item   9
 3  Widgets line_item   10
 4  Widgets line_item   11
 5  Woo Logo    line_item   473
 6  Woo Logo    line_item   473

Ich möchte nun zusätzliche Spalten für jede Position aus der Tabelle wp_woocommerce_order_itemmeta hinzufügen. Diese Tabelle enthält mehrere Datensätze für jede Werbebuchung wie folgt:

 meta_id    order_item_id   meta_key    meta_value
 136    16  _qty    4
 137    16  _tax_class  
 138    16  _product_id 87
 139    16  _variation_id   0
 140    16  _line_subtotal  36
 141    16  _line_total 36
 142    16  _line_subtotal_tax  3.6
 143    16  _line_tax   3.6

Ich möchte jedes davon in eine neue Spalte konvertieren, damit meine Ausgabe aus Folgendem besteht:

 order_item_id, order_item_name, order_item_type, order_id, qty, tax_class, product_id, variation_id, line_subtotal, line_total, line_subtotal_tax, line_tax

Ich bin mir nicht sicher, welche SQL-Syntax ich hier verwenden soll – ich habe versucht, eine ähnliche Syntax wie im obigen Link zu verwenden, konnte sie aber bisher nicht zum Laufen bringen und bin mir nicht sicher, ob dies tatsächlich die richtige Syntax ist.

Ich habe es geschafft, dies durch Versuch und Irrtum herauszufinden. Hier ist die Abfrage, die am Ende funktioniert hat:

select
p.order_id,
p.order_item_id,
p.order_item_name,
p.order_item_type,
max( CASE WHEN pm.meta_key = '_product_id' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as productID,
max( CASE WHEN pm.meta_key = '_qty' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as Qty,
max( CASE WHEN pm.meta_key = '_variation_id' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as variationID,
max( CASE WHEN pm.meta_key = '_line_total' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as lineTotal,
max( CASE WHEN pm.meta_key = '_line_subtotal_tax' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as subTotalTax,
max( CASE WHEN pm.meta_key = '_line_tax' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as Tax,
max( CASE WHEN pm.meta_key = '_tax_class' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as taxClass,
max( CASE WHEN pm.meta_key = '_line_subtotal' and p.order_item_id = pm.order_item_id THEN pm.meta_value END ) as subtotal
from
ocm_woocommerce_order_items as p,
ocm_woocommerce_order_itemmeta as pm
 where order_item_type="line_item" and
 p.order_item_id = pm.order_item_id
 group by
p.order_item_id

  • Vielen Dank. Wie bekommen customer_id Feld mit Top-Feldern?

    – Mostafa Norzade

    20. Mai 2019 um 14:16 Uhr


  • Sie müssen die Bestellung selbst abfragen, die die Kunden-ID für jede Bestellung enthält, also fragen Sie die ab wp_posts Tabelle direkt dazu

    – Benutzer982124

    21. Mai 2019 um 23:49 Uhr

  • Menge kommt leer :/

    – Diego Ponciano

    11. Februar 2020 um 23:24 Uhr

  • In jedem max das p.order_item_id = pm.order_item_id Bedingung erscheint unnötig, da diese Bedingung bereits aktiviert ist p und pm in dem where Klausel.

    – jcalfee314

    30. Juli um 17:19 Uhr


Mit dieser Abfrage können Sie alle abgeschlossenen Bestellungen inklusive aller Metadaten abrufen.

SELECT
        p.ID as order_id,
        p.post_date,
        max( CASE WHEN pm.meta_key = '_billing_email' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_email,
        max( CASE WHEN pm.meta_key = '_billing_first_name' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_first_name,
        max( CASE WHEN pm.meta_key = '_billing_last_name' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_last_name,
        max( CASE WHEN pm.meta_key = '_billing_address_1' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_address_1,
        max( CASE WHEN pm.meta_key = '_billing_address_2' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_address_2,
        max( CASE WHEN pm.meta_key = '_billing_city' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_city,
        max( CASE WHEN pm.meta_key = '_billing_state' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_state,
        max( CASE WHEN pm.meta_key = '_billing_postcode' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_postcode,
        max( CASE WHEN pm.meta_key = '_shipping_first_name' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_first_name,
        max( CASE WHEN pm.meta_key = '_shipping_last_name' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_last_name,
        max( CASE WHEN pm.meta_key = '_shipping_address_1' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_address_1,
        max( CASE WHEN pm.meta_key = '_shipping_address_2' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_address_2,
        max( CASE WHEN pm.meta_key = '_shipping_city' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_city,
        max( CASE WHEN pm.meta_key = '_shipping_state' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_state,
        max( CASE WHEN pm.meta_key = '_shipping_postcode' and p.ID = pm.post_id THEN pm.meta_value END ) as _shipping_postcode,
        max( CASE WHEN pm.meta_key = '_order_total' and p.ID = pm.post_id THEN pm.meta_value END ) as order_total,
        max( CASE WHEN pm.meta_key = '_order_tax' and p.ID = pm.post_id THEN pm.meta_value END ) as order_tax,
        max( CASE WHEN pm.meta_key = '_paid_date' and p.ID = pm.post_id THEN pm.meta_value END ) as paid_date,
        ( select group_concat( order_item_name separator '|' ) from wp_woocommerce_order_items where order_id = p.ID ) as order_items
    FROM
        wp_posts p 
        join wp_postmeta pm on p.ID = pm.post_id
        join wp_woocommerce_order_items oi on p.ID = oi.order_id
    WHERE
        post_type="shop_order" and
        post_date BETWEEN '2021-07-01' AND '2021-08-01' and
        post_status="wc-completed"
    group by
        p.ID

  • Danke fürs Teilen – ich habe jetzt einige Zeit damit herumgespielt, um Produkte für Bestellungen zu bekommen, die gerade bearbeitet werden!

    – cmptrwizard

    7. September 2021 um 18:27 Uhr

@mostafa Norzade Ich habe kein Kommentarvorrecht, also poste ich als Antwort

der meta_key für user_id ist ‘_customer_user’, also fügen Sie einfach Folgendes hinzu: max( CASE WHEN pm.meta_key = ‘_customer_user ‘ and p.ID = pm.post_id THEN pm.meta_value END ) as customer_user,

  • es funktioniert nicht.. können Sie die vollständige Abfrage neu schreiben?

    – Mariuta Mihai Dan

    12. Februar 2021 um 22:44 Uhr

1365510cookie-checkSQL Select-Abfrage zum Abrufen von WooCommerce-Bestellpositionen und Metadaten

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

Privacy policy