{"id":561,"date":"2017-07-31T16:38:27","date_gmt":"2017-07-31T14:38:27","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=561"},"modified":"2017-07-31T18:18:12","modified_gmt":"2017-07-31T16:18:12","slug":"evis-csv-importer-die-zweite-ein-beitrag-pro-mitglied","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/07\/31\/evis-csv-importer-die-zweite-ein-beitrag-pro-mitglied\/","title":{"rendered":"Evis CSV-Importer die Zweite: ein Beitrag pro Mitglied"},"content":{"rendered":"<h2>Die Vorgabe wie gehabt<\/h2>\n<p>F\u00fcr jedes Mitglied wird ein Beitrag in WordPress angelegt. Der Beitragstitel besteht aus der ID (Mitgliedsnummer), dem Vornamen und dem Nachnamen, das ganze mit Leerzeichen getrennt. Die restlichen Mitgliedsdaten kommen in benutzerdefinierte Felder. Soweit alles klar? dann wollen wir mal.<\/p>\n<h2>Zeilenweise Verarbeitung der CSV-Datei<\/h2>\n<p>Unsere CSV-Datei haben wir zeilenweise eingelesen, wir arbeiten sie jetzt innerhalb der while (!feof)-Schleife bis zum Dateiende ab. Nur mal kurz zum Rekapitulieren, die Debug-Ausgabe sollte in etwa so aussehen:<\/p>\n<div id=\"attachment_562\" style=\"width: 459px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-562\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-562\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/csv_debugausgabe.jpg\" alt=\"csv_debugausgabe\" width=\"449\" height=\"550\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/csv_debugausgabe.jpg 449w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/csv_debugausgabe-245x300.jpg 245w\" sizes=\"(max-width: 449px) 100vw, 449px\" \/><p id=\"caption-attachment-562\" class=\"wp-caption-text\">csv_debugausgabe<\/p><\/div>\n<p>Wir haben pro Mitglied (=pro Zeile) 9 Datenfelder jeweils in ein Array eingelesen, die holen wir uns mit dem Index 0..8, das sah f\u00fcr die Debug-Ausgabe so aus:<\/p>\n<pre>\/\/Debug-Ausgabe des Arrays\r\n echo $arr_akt_zeile[0].\"&lt;br&gt;\";\r\n echo $arr_akt_zeile[1].\"&lt;br&gt;\";\r\n echo $arr_akt_zeile[2].\"&lt;br&gt;\";\r\n echo $arr_akt_zeile[3].\"&lt;br&gt;\";\r\n echo $arr_akt_zeile[4].\"&lt;br&gt;\";\r\n echo $arr_akt_zeile[5].\"&lt;br&gt;\";\r\n echo $arr_akt_zeile[6].\"&lt;br&gt;\";\r\n echo $arr_akt_zeile[7].\"&lt;br&gt;\";\r\n echo $arr_akt_zeile[8].\"&lt;br&gt;&lt;br&gt;\";<\/pre>\n<p>Jetzt m\u00fcssen wir nur noch die Feldnamen f\u00fcr die einzelnen Datenfelder zuordnen, dann k\u00f6nnen wir. Ich mach da mal eine einfache Liste:<\/p>\n<p>0 mnr<br \/>\n1 vorname<br \/>\n2 nachname<br \/>\n3 geschlecht<br \/>\n4 email<br \/>\n5 plz<br \/>\n6 ort<br \/>\n7 strassehausnummer<br \/>\n8 telefon<\/p>\n<p>Alles paletti? Jetzt bauen wir uns f\u00fcr jede Input-Zeile einen neuen Beitrag.<\/p>\n<h2>Die Funktion wp_insert_post() ganz minimalistisch<\/h2>\n<p>Welche Parameter man der Funktion zum Erzeugen eines neuen Beitrags alle mitgeben, kann jeder selber im Codex nachlesen. Wir begn\u00fcgen uns hier mit ganz wenigen Feldern:<\/p>\n<ol>\n<li>Titel: Mitgliedsnummer, Vorname und Name, mit Leerzeichen getrennt<\/li>\n<li>Content: ich geb hier einfach die Mitgliedsnummer nochmal aus<\/li>\n<li>Status publish<\/li>\n<li>Author, 1 ist mein Admin:<\/li>\n<\/ol>\n<pre>\/\/ Beitragsobjekt anlegen\r\n\u00a0\u00a0 \u00a0$my_post = array();\r\n\u00a0\u00a0 \u00a0$my_post['post_title']\u00a0\u00a0\u00a0 = $arr_akt_zeile[0].\" \".$arr_akt_zeile[1].\" \".$arr_akt_zeile[2];\r\n\u00a0\u00a0 \u00a0$my_post['post_content']\u00a0 = \"Mitgliedsnummer: \".$arr_akt_zeile[0];\r\n\u00a0\u00a0 \u00a0$my_post['post_status']\u00a0\u00a0 = 'publish';\r\n\u00a0\u00a0 \u00a0$my_post['post_author']\u00a0\u00a0 = 1;\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Beitrag in Datenbank einf\u00fcgen\r\n\u00a0\u00a0 \u00a0$neue_id = wp_insert_post( $my_post );<\/pre>\n<p>Wichtig: mit der letzten Anweisung <em>$neue_id=&#8230; <\/em>holen wir uns den R\u00fcckgabewert der Funktion wp_insert_post, das ist die WordPress-ID des neuen Beitrags. Die brauchen wir n\u00e4mlich gleich noch f\u00fcr die beutzerdefinierten Felder. Aber jetzt lassen wir die ganze Sache einfach mal laufen, und wenn alles pa\u00dft, sollte unser CSV-Importer-Plugin jetzt brav 10 neue Beitr\u00e4ge anlegen:<\/p>\n<div id=\"attachment_565\" style=\"width: 1105px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-565\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-565\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zehn_neue_beitr\u00e4ge.jpg\" alt=\"zehn_neue_beitr\u00e4ge\" width=\"1095\" height=\"594\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zehn_neue_beitr\u00e4ge.jpg 1095w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zehn_neue_beitr\u00e4ge-300x163.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zehn_neue_beitr\u00e4ge-768x417.jpg 768w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zehn_neue_beitr\u00e4ge-1024x555.jpg 1024w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zehn_neue_beitr\u00e4ge-624x338.jpg 624w\" sizes=\"(max-width: 1095px) 100vw, 1095px\" \/><p id=\"caption-attachment-565\" class=\"wp-caption-text\">zehn_neue_beitr\u00e4ge<\/p><\/div>\n<p>Hinweis: sollte ein Beitrag mehr als erwartet (ohne Titel) angelegt werden, ist am Ende der CSV-Datei ein CR\/LF zuviel, das erzeugt eine leere Zeile. Im Notepad++ rausl\u00f6schen, dann pa\u00dfts.<\/p>\n<h2>Wir bef\u00fcllen jetzt noch die benutzerdefinierten Felder<\/h2>\n<p>Dazu benutzen wir die Funktion add_post_meta(), die sieht minimalistisch abgespeckt so aus:<\/p>\n<p><code>add_post_meta(\u00a0$post_id,\u00a0$meta_key,\u00a0$meta_value)<\/code><\/p>\n<p>Dabei ist zu beachten, da\u00df man \u00fcber die $post_id die WordPress-ID des aktuellen Beitrags mitgeben mu\u00df. Aber die haben wir uns ja weiter oben schon geholt, die steckt in der Variablen <em>$neue_id<\/em>. Also, wir f\u00fcgen jetzt mal nur zwei Felder zum Testen ein:<\/p>\n<pre>\/\/*** Benutzerdefinierte Felder f\u00fcllen\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/\/Postleitzahl\r\n\u00a0\u00a0 \u00a0add_post_meta( $neue_id,'plz', $arr_akt_zeile[5]);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/\/Ort\r\n\u00a0\u00a0 \u00a0add_post_meta( $neue_id,'ort', $arr_akt_zeile[6]);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/\/*** Ende Benutzerdefinierte Felder f\u00fcllen<\/pre>\n<p>Wenn man den Import jetzt nochmal laufen l\u00e4\u00dft und in einen der neu erzeugten Beitr\u00e4ge reinschaut, sollte man etwa Folgendes sehen:<\/p>\n<div id=\"attachment_566\" style=\"width: 710px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-566\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-566\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zwei_benutzerdef_felder.jpg\" alt=\"zwei_benutzerdef_felder\" width=\"700\" height=\"629\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zwei_benutzerdef_felder.jpg 700w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zwei_benutzerdef_felder-300x270.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/07\/zwei_benutzerdef_felder-624x561.jpg 624w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><p id=\"caption-attachment-566\" class=\"wp-caption-text\">zwei_benutzerdef_felder<\/p><\/div>\n<h2>Das wars!<\/h2>\n<p>Fertig ist unser hausgemachter CSV-Importer, der &#8211; man sehe und staune! &#8211; auch Custom Fields bef\u00fcllen kann. Wirklich keine Hexerei, oder?<\/p>\n<p>Die Anzeige der benutzerdefinierten Felder basteln wir wie gehabt in einen Shortcode oder ins Template rein und benutzen daf\u00fcr die Funktion get_post_meta(), das haben wir alles schon gehabt, das mu\u00df ich jetzt nicht wirklich nochmal ausf\u00fchrlich beschreiben.<\/p>\n<h2>Ja aber, was ist jetzt mit den neuen Mitgliedern?<\/h2>\n<p>Das ist eine sehr berechtigte Frage. Ich stelle das Szenario nochmal kurz vor:<\/p>\n<ol>\n<li>Die existierende Excel-Liste mit Mitgliederdaten ist als CSV-Datei bereits einmal importiert worden<\/li>\n<li>\u00c4nderungen an den Mitglieder-Daten werden ab jetzt in WordPress durch Editieren des jeweilige Beitrags gepflegt, d.h. wir definieren WordPress als unser f\u00fchrendes System<\/li>\n<li>Was geschieht jetzt, wenn neue Mitglieder nach dem ersten Import hinzukommen?<\/li>\n<\/ol>\n<p>Wie bereits mal kurz erw\u00e4hnt k\u00f6nnte man jetzt f\u00fcr jedes neue Mitglied manuell einen neuen Beitrag mit ID und Name im Titel anlegen, und auch die ben\u00f6tigten benutzerdefinierten Felder manuell nachziehen. Das gef\u00e4llt mir allerdings \u00fcberhaupt nicht, weil es 1. viel Handarbeit und 2. sehr fehleranf\u00e4llig ist. Deswegen entscheide ich mich f\u00fcr eine<\/p>\n<h2>Hybrid-L\u00f6sung:<\/h2>\n<ol>\n<li>Die alte Excel-Liste wird weiter gepflegt, die Mitgliedsnummern werden fortlaufend weiter vergeben.<\/li>\n<li>Wenn gen\u00fcgend neue Mitglieder hinzugekommen sind (z.B. zum Monatsende) wird die Excel-Liste neu importiert, und zwar ganz.<\/li>\n<li>Ich erg\u00e4nze das Import-Plugin um einen Select, der vor dem Anlegen eines neuen Beitrages abfragt, ob in der Tabelle wp_posts bereits ein Beitrag mit dem Titel nach dem Muster mnr+vorname+nachname vorhanden ist. Falls ja (if-Abfrage), wird f\u00fcr den aktuellen Datensatz kein neuer Beitrag angelegt, der betreffende Datensatz wird einfach \u00fcbersprungen.<\/li>\n<\/ol>\n<p>So stelle ich sicher, da\u00df nur f\u00fcr die neu hinzugekommenen Mitglieder auch neue Beitr\u00e4ge angelegt werden, und da\u00df bereits vorhandene Daten nicht \u00fcberschrieben werden. Wie das mit dem Select dann praktisch aussieht, da\u00df kann jeder selber ausprobieren, nicht vergessen global $wpdb zu deklarieren, dann klappt das schon.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Vorgabe wie gehabt F\u00fcr jedes Mitglied wird ein Beitrag in WordPress angelegt. Der Beitragstitel besteht aus der ID (Mitgliedsnummer), dem Vornamen und dem Nachnamen, das ganze mit Leerzeichen getrennt. Die restlichen Mitgliedsdaten kommen in benutzerdefinierte Felder. Soweit alles klar? dann wollen wir mal. Zeilenweise Verarbeitung der CSV-Datei Unsere CSV-Datei haben wir zeilenweise eingelesen, wir [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[18,25,4,8,2],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/561"}],"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=561"}],"version-history":[{"count":5,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/561\/revisions"}],"predecessor-version":[{"id":571,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/561\/revisions\/571"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=561"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=561"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}