{"id":642,"date":"2017-08-29T10:50:11","date_gmt":"2017-08-29T08:50:11","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=642"},"modified":"2017-08-29T10:54:30","modified_gmt":"2017-08-29T08:54:30","slug":"nix-fuer-schwache-nerven-woocommerce-bestellungen-auf-der-datenbank","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/08\/29\/nix-fuer-schwache-nerven-woocommerce-bestellungen-auf-der-datenbank\/","title":{"rendered":"Nix f\u00fcr schwache Nerven: wooCommerce-Bestellungen auf der Datenbank"},"content":{"rendered":"<h2>1 Bestellung = 1 Beitrag<\/h2>\n<p>Wenn jetzt endlich ein Kunde etwas in unserem Online-Shop gekauft hat, landet die Bestellung &#8211; wie k\u00f6nnte es anders sein &#8211; in der wp_posts mit dem Post Type &#8222;shop_order&#8220;. Das schauen wir uns mal ganz kurz an. Ich nehme nur ein paar ausgew\u00e4hlte Felder, sonst wirds un\u00fcbersichtlich:<\/p>\n<p><em>SELECT wp_posts.ID, wp_posts.post_author, wp_posts.post_content, wp_posts.post_title, wp_posts.post_status, wp_posts.post_name, wp_posts.post_type, wp_posts.comment_count<\/em><br \/>\n<em>FROM wp_posts<\/em><br \/>\n<em>WHERE (((wp_posts.post_type) Like &#8222;shop_order&#8220;));<\/em><\/p>\n<p>Ergebnis:<\/p>\n<div id=\"attachment_643\" style=\"width: 1068px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-643\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-643\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/shop_orders.jpg\" alt=\"shop_orders\" width=\"1058\" height=\"174\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/shop_orders.jpg 1058w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/shop_orders-300x49.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/shop_orders-768x126.jpg 768w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/shop_orders-1024x168.jpg 1024w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/shop_orders-624x103.jpg 624w\" sizes=\"(max-width: 1058px) 100vw, 1058px\" \/><p id=\"caption-attachment-643\" class=\"wp-caption-text\">shop_orders<\/p><\/div>\n<p>Der post_status scheint noch interessant zu sein, da steht nur einer auf wc-completed, alle anderen auf wc-on-hold. Was ein comment_count von 3 bedeuten soll ist mir allerdings ein R\u00e4tsel &#8211; und es ist mir schnuppe.<\/p>\n<h2>Eine Bestellung, wie viele Eintr\u00e4ge in der wp_postmeta?<\/h2>\n<p>Wir klemmen uns mal die erste Order-ID, das ist die 42, und gehen in der wp_postmeta suchen, was dazu alles abgespeichert ist. Zur Erinnerung: in der wp_postmeta ist jedem Datensatz die zugeh\u00f6rige post_id aus der wp_posts zugeordnet.<\/p>\n<p><em>SELECT wp_postmeta.meta_id, wp_postmeta.post_id, wp_postmeta.meta_key, wp_postmeta.meta_value, wp_posts.ID, wp_posts.post_title, wp_posts.post_status, wp_posts.post_type<\/em><br \/>\n<em>FROM wp_postmeta INNER JOIN wp_posts ON wp_postmeta.post_id = wp_posts.ID<\/em><br \/>\n<em>WHERE (((wp_postmeta.post_id)=&#8220;42&#8243;) AND ((wp_posts.post_type) Like &#8222;shop_order&#8220;));<\/em><\/p>\n<p>Das &#8211; halleluja! Spuckt 48 Datens\u00e4tze aus. Achtundvierzig. Will heissen, zu Order Nr. 42 hat wooCommerce 48 Eintr\u00e4ge in der wp_postmeta angelegt und dort irgendwelche Daten gespeichert. Ich stelle hier mal spa\u00dfeshalber eine Liste der Meta-Keys rein:<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" bgcolor=\"#ffffff\">\n<caption><b>order_42<\/b><\/caption>\n<thead>\n<tr>\n<th bgcolor=\"#c0c0c0\"><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">meta_key<\/span><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_order_key<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_customer_user<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_payment_method<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_payment_method_title<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_transaction_id<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_customer_ip_address<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_customer_user_agent<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_created_via<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_date_completed<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_completed_date<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_date_paid<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_paid_date<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_cart_hash<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_first_name<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_last_name<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_company<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_address_1<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_address_2<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_city<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_state<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_postcode<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_country<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_email<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_phone<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_first_name<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_last_name<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_company<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_address_1<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_address_2<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_city<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_state<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_postcode<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_country<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_order_currency<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_cart_discount<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_cart_discount_tax<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_order_shipping<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_order_shipping_tax<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_order_tax<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_order_total<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_order_version<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_prices_include_tax<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_billing_address_index<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_address_index<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_shipping_method<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_recorded_sales<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_recorded_coupon_usage_counts<\/span><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td><span style=\"font-size: 10pt; color: #000000; font-family: Arial;\">_order_stock_reduced<\/span><\/td>\n<\/tr>\n<\/tbody>\n<tfoot><\/tfoot>\n<\/table>\n<p>H\u00fcbsch, nicht wahr? Wenigstens haben die wooCommerce_Entwickler recht sprechende Namen f\u00fcr die Meta-Keys verwendet, da kann man sich in den meisten F\u00e4llen wenigstens denken, was das sein soll.<\/p>\n<p>Und das sind nur die Eintr\u00e4ge zu einer einzigen ausgew\u00e4hlten Bestellung!<\/p>\n<h2>Was, wenn ich Auswertungen \u00fcber die Bestellungen fahren will?<\/h2>\n<p>Aber ja verehrtes Publikum, sowas kommt vor. Da\u00df man wissen will, wie viele Bestellungen an einem bestimmten Tag eingegangen sind. Oder wie viele davon per Scheck bezahlt wurden. Oder Bestellungen nach Postleitzahlen geordnet oder oder&#8230; sie wissen schon, was da so alles beim Kunden anliegt.<\/p>\n<p>Das hatten wir schon ein paar mal, wenn man aus der wp_postmeta die meta_values zu einer bestimmten ID aus der wp_posts herauskriegen will, mu\u00df man pro Meta Key einen Join auf die wp_postmeta anlegen. W\u00fcrde im Ernstfall hier einen 48fachen Join verlangen, das mu\u00df man sich mal so richtig reinziehen&#8230;<\/p>\n<p>Eine andere M\u00f6glichkeit w\u00e4re eine Kreuztabelle (Microsoft Access kann sowas, bei MySQL bin ich mir nicht sicher), aber die h\u00e4tte dann mehr als 48 Felder, das ist auch eher von der unhandlichen Sorte.<\/p>\n<p>Ja Kruzit\u00fcrken, haben die noch nie etwas von Fremdschl\u00fcsseln und Detailtabellen geh\u00f6rt?<\/p>\n<h2>Ein Beispiel wie man&#8217;s NICHT macht<\/h2>\n<p>Wir nehmen nur mal ein Beispiel:<\/p>\n<p>Beim meta_key _payment_method steht in meinem Datensatz Nr. 42 der meta_value &#8222;cheque&#8220;. Dann nehmen wir den meta_key\u00a0_payment_method_title noch mit, der hat den Wert &#8222;Scheckzahlung&#8220;<\/p>\n<p>Und wenn ich jetzt ein paar Hundert oder Tausend Bestellungen habe, stehen der cheque und die Scheckzahlung eben auch Hundert oder Tausend mal in der wp_postmeta. Das, verehrtes Publikum, ist Redundanz, und zwar so richtig kriminelle Redundanz. So macht man sowas nicht. Da nimmt man eine Detailtabelle mit den Zahlungsarten (Scheck, Nachname, Bar bei Abholung&#8230;), von denen kriegt jede eine ID, die wird zu den Bestellungen dann als Fremdschl\u00fcssel gespeichert. Das ist Datennormalisierung f\u00fcr Anf\u00e4nger, erstes Semester.<\/p>\n<p>Und damit, liebe Leser, lasse ich euch mal mit den 48 Meta Keys allein meditieren, das langt f\u00fcr einen Beitrag.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1 Bestellung = 1 Beitrag Wenn jetzt endlich ein Kunde etwas in unserem Online-Shop gekauft hat, landet die Bestellung &#8211; wie k\u00f6nnte es anders sein &#8211; in der wp_posts mit dem Post Type &#8222;shop_order&#8220;. Das schauen wir uns mal ganz kurz an. Ich nehme nur ein paar ausgew\u00e4hlte Felder, sonst wirds un\u00fcbersichtlich: SELECT wp_posts.ID, wp_posts.post_author, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7,24,2],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/642"}],"collection":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/comments?post=642"}],"version-history":[{"count":2,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/642\/revisions"}],"predecessor-version":[{"id":645,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/642\/revisions\/645"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}