{"id":608,"date":"2017-08-21T17:38:30","date_gmt":"2017-08-21T15:38:30","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=608"},"modified":"2017-08-21T17:38:30","modified_gmt":"2017-08-21T15:38:30","slug":"kraut-und-rueben-auf-der-datenbank-wo-woocommerce-die-produktdaten-speichert","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/08\/21\/kraut-und-rueben-auf-der-datenbank-wo-woocommerce-die-produktdaten-speichert\/","title":{"rendered":"Kraut und R\u00fcben auf der Datenbank: wo wooCommerce die Produktdaten speichert"},"content":{"rendered":"<h2>Ein Produkt = Beitrag: ja, und der Rest?<\/h2>\n<p>Wie ihnen bei einem kurzen Blick auf die Datenbank vielleicht schon aufgefallen ist, speichert wooCommerce die Produkte in der wp_posts mit dem post_type &#8222;product&#8220;. Das kennen wir ja schon, die wp_posts mu\u00df oft f\u00fcr allerlei Datengemusel herhalten, das mit &#8222;posts&#8220;, also mit Beitr\u00e4gen, nicht im entferntesten was zu tun hat.Die Produktbilder landen \u00fcbrigens auch in der wp_posts, aber das kennen wir ja auch schon, WordPress macht das halt mit Bildern so, mit dem post_type &#8222;attachment&#8220;.<\/p>\n<p>\u00dcber Sinn und Unsinn dieser Praxis kann man lange diskutieren, es wird halt oft so gemacht und sogar als Best Practice empfohlen. Und da wir uns f\u00fcr wooCommerce als Shopsoftware entschieden haben, leben wir halt damit. Ich mach das hier mal nur im Schnelldurchgang, die Details kann ja jeder selber nachschauen.<\/p>\n<h2>Kleine Wiederholung: unsere Produktdaten<\/h2>\n<ol>\n<li>Feld in der CSV-Datei:<br \/>\nArtikelnummer;Kategorie<strong>;Bezeichnung;Beschreibung<\/strong>;<strong>Format<\/strong>;Preis<\/li>\n<li>Feld in der Dropdown-Liste:<br \/>\nsku; category; <strong>post_title; post_content; post_excerpt<\/strong>; regular_price<\/li>\n<\/ol>\n<p>Die fett markierten Felder stecken in der wp_posts unter den bekannten Feldnamen. Aber wo sind die anderen? Gehen wir&#8217;s mal der Reihe nach durch.<\/p>\n<ol>\n<li>Artikelnummer: sku<br \/>\nDie sku ist in der wp_postmeta abgespeichert, unter dem meta_key _sku. Wir filtern uns die mal im phpmyadmin raus:<\/p>\n<div id=\"attachment_614\" style=\"width: 526px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-614\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-614\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/sku-1.jpg\" alt=\"_sku\" width=\"516\" height=\"422\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/sku-1.jpg 516w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/sku-1-300x245.jpg 300w\" sizes=\"(max-width: 516px) 100vw, 516px\" \/><p id=\"caption-attachment-614\" class=\"wp-caption-text\">_sku<\/p><\/div>\n<p>Zur Erinnerung: in der post_meta ist \u00fcber die post_id zugeordnet, zu welchem Beitrag der meta_key geh\u00f6rt.<\/li>\n<li>Preis = _regular_price<br \/>\nAuch der steckt in der wp_postmeta, eben unter dem meta_key _regular_price.<\/li>\n<li>Kategorie = category<br \/>\nObacht! Das sind von wooCommerce eigens angelegte Produktkategorien, nicht die altbekannten Beitragskategorien von WordPress. Und hier wirds jetzt richtig lustig, die zugeh\u00f6rigen Daten sind n\u00e4mlich \u00fcber die vier Terms-Tabellen verteilt. Um herauszufinden, welche Produktkategorie zu einem Produkt geh\u00f6ren, mu\u00df man einen Join \u00fcber mindestens drei Tabellen fahren, da sieht dann der Select ungef\u00e4hr so aus:<\/p>\n<p><em>(&#8222;SELECT Wp_term_relationships.*,Wp_terms.* FROM Wp_term_relationships<\/em><\/p>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LEFT JOIN Wp_posts\u00a0 ON Wp_term_relationships.object_id = Wp_posts.ID<\/em><\/p>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LEFT JOIN Wp_term_taxonomy ON Wp_term_taxonomy.term_taxonomy_id = Wp_term_relationships.term_taxonomy_id<\/em><\/p>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LEFT JOIN Wp_terms ON Wp_terms.term_id = Wp_term_relationships.term_taxonomy_id<\/em><\/p>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 WHERE post_type = &#8218;product&#8216; AND taxonomy = &#8218;product_cat&#8216;<\/em><\/p>\n<p><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AND\u00a0 object_id = &#8222;.$aktuelleID.&#8220;&#8220;)<br \/>\n<\/em><\/p>\n<p>Und das finde ich jetzt schon weniger lustig.<\/li>\n<\/ol>\n<h2>Und wenn ich mal alle relevanten Daten zu meinen Produkten brauche?<\/h2>\n<p>Ja, dann fahren wir halt einen Join \u00fcber die wp_posts, die wp_postmeta und die bekannten Terms-Tabellen. Das wird dann so richtig \u00fcbersichtlich. Darf ich bei dieser Gelegenheit mal daran erinnern, wie unsere Artikelliste urspr\u00fcnglich mal aussah:<\/p>\n<div id=\"attachment_598\" style=\"width: 811px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-598\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-598\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/artikelliste_excel.jpg\" alt=\"artikelliste_excel\" width=\"801\" height=\"297\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/artikelliste_excel.jpg 801w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/artikelliste_excel-300x111.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/artikelliste_excel-768x285.jpg 768w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/artikelliste_excel-624x231.jpg 624w\" sizes=\"(max-width: 801px) 100vw, 801px\" \/><p id=\"caption-attachment-598\" class=\"wp-caption-text\">artikelliste_excel<\/p><\/div>\n<p>Ach, was war das noch sch\u00f6n einfach und \u00fcbersichtlich! Ganz ehrlich, ich finde es schon ziemlich haneb\u00fcchen, welche Bauchaufz\u00fcge man machen mu\u00df um wooCommerce die eingegebenen Produktdaten auf Datenbankebene wieder zu entlocken.<\/p>\n<p>Da kommt jetzt nat\u00fcrlich die berechtigte Frage: wer braucht das schon? Reicht doch, wenn wir die Produkt-Daten per CSV reinjagen und in wooCommerce verwalten. Das, liebes Publikum, ist eine extra Diskussion wert. In einem neuen Artikel.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Produkt = Beitrag: ja, und der Rest? Wie ihnen bei einem kurzen Blick auf die Datenbank vielleicht schon aufgefallen ist, speichert wooCommerce die Produkte in der wp_posts mit dem post_type &#8222;product&#8220;. Das kennen wir ja schon, die wp_posts mu\u00df oft f\u00fcr allerlei Datengemusel herhalten, das mit &#8222;posts&#8220;, also mit Beitr\u00e4gen, nicht im entferntesten was [&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\/608"}],"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=608"}],"version-history":[{"count":5,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/608\/revisions"}],"predecessor-version":[{"id":615,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/608\/revisions\/615"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=608"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=608"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}