{"id":1630,"date":"2023-03-15T10:43:43","date_gmt":"2023-03-15T09:43:43","guid":{"rendered":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=1630"},"modified":"2023-03-15T11:02:03","modified_gmt":"2023-03-15T10:02:03","slug":"jetzt-aber-wir-erstellen-ein-stichwortverzeichnis-mit-linkliste","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2023\/03\/15\/jetzt-aber-wir-erstellen-ein-stichwortverzeichnis-mit-linkliste\/","title":{"rendered":"Jetzt aber: wir erstellen ein Stichwortverzeichnis mit Linkliste"},"content":{"rendered":"\n<p>Nat\u00fcrlich hab ich (design as you go) den PAP noch ein paar mal radikal ge\u00e4ndert und das Konzept einige Male wieder \u00fcber den Haufen geschmissen. Aber jetzt l\u00e4uft zumindest eine Rohfassung, und die m\u00f6chte ich euch nicht vorenthalten. Was bei mir wie immer fehlt ist eine Foolproof Fehlerbehandlung, da m\u00fcsste man noch einiges tun. So wie es ist kann man das Ding keinesfalls in einer echten, life WordPress Installation verwenden, das w\u00e4re selbstm\u00f6rderisch. Aber auf meinem lokalen Webserver ist es gut aufgehoben und kann als Ausgangsmaterial f\u00fcr ein vern\u00fcnftiges Plugin dienen.<\/p>\n\n\n\n<p>Die wichtigsten Punkte in meinem umgearbeiteten PAP im \u00dcberblick:<\/p>\n\n\n\n<ul>\n<li>es gibt zwei Plugins. Eins erstellt die CSV-Datei mit den Stichworten aus den Titeln der Beitr\u00e4ge. Das zweite erzeugt eine Konfiguration f\u00fcr die Ausgabe (sp\u00e4ter mehr) und stellt einen Shortcode bereit, der das Stichwortverzeichnis an einer beliebigen Stelle (Seite) erzeugt.<\/li>\n\n\n\n<li>Die CSV-Datei findet auf wundersame Weise ihren Weg in das Verzeichnis des zweiten Plugins. Das Plugin liest die Datei zeilenweise in ein Array ein und erzeugt daraus ein h\u00fcbsch alfabetisch sortiertes Stichwortregister. Klick auf ein Stichwort \u00f6ffnet eine Unterseite und gibt als Parameter das aktuelle Stichwort mit.<\/li>\n\n\n\n<li>Damit eine Liste der gefundenen Beitr\u00e4ge zu einem Stichwort ausgegeben werden kann, ist die Ausgabe auf einer Unterseite zwingend notwendig. Dies ist eine ganz normale WordPress-Seite, die beim Anlegen der Plugin-Konfiguration neu erzeugt wird. Sie enth\u00e4lt nur einen Shortcode, der den beim Aufruf \u00fcbergebenen Parameter stichwort \u00fcbernimmt und daraus eine Liste der Beitr\u00e4ge zu diesem Stichwort erstellt. Die ID und der Permalink dieser Seite werden in der wp_options gespeichert. Diese Seite taucht auch ganz normal unter &#8222;Alle Seiten&#8220; auf. Wenn man sie l\u00f6scht &#8211; Pech. Da fehlt wieder die Fehlerbehandlung.<\/li>\n\n\n\n<li>Vorl\u00e4ufig gibt es keine M\u00f6glichkeit, die Konfiguration des zweiten Plugins nachtr\u00e4glich zu \u00e4ndern. F\u00fcr Entwickler: man kann die Eintr\u00e4ge in der wp_options manuell l\u00f6schen, dann kann man die Konfiguration neu schreiben. Das sollte man aber nicht im laufenden Betrieb tun, Pfusch auf der Datenbank kann zu Serverabst\u00fcrzen f\u00fchren.  Hier To Do.<\/li>\n<\/ul>\n\n\n\n<p>So, genug ge-PAP-t. Jetzt wollen wir uns mal das Plugin ShortcodeStichwort n\u00e4her ansehen.<\/p>\n\n\n\n<h2>Teil 1 die Konfiguration<\/h2>\n\n\n\n<p>Ich erzeuge zun\u00e4chst einen Eintrag im Admin-Men\u00fc, wie gehabt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/********************* Eintrag im Adminmen\u00fc erzeugen\n  add_action('admin_menu', 'shortcodestichwort_plugin_setup_menu');\n\t\n\tfunction shortcodestichwort_plugin_setup_menu(){\n    add_menu_page( 'ShortcodeStichwort', 'Shortcode Stichwort Konfiguration', 'manage_options', 'shortcodestichwort', 'shortcodestichwort_init' );\n}<\/code><\/pre>\n\n\n\n<p>Dann gehts los: die Funktion shortcodestichwort_init fragt zuerst mal ab, ob eine Konfiguration bereits existiert, dazu hab ich einen Flag in der Options-Tabelle gesetzt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function shortcodestichwort_init(){\n\techo \"&lt;h2&gt;Konfiguration f\u00fcr die Ausgabe Stichwortverzeichnis&lt;\/h2&gt;\";\n\t\n\t\/\/Pr\u00fcfen, ob bereits eine Konfiguration gespeichert wurde\n\t$checkkonfig = get_option('stichwortkonfigexists');\n\t\n\tif ($checkkonfig == \"\"){\n\techo \"Noch keine Konfiguration gespeichert. Sie m\u00fcssen einmal auf den Button Konfiguration speichern klicken. \";}<\/code><\/pre>\n\n\n\n<p>Der Button &#8222;Konfiguration speichern&#8220; wird nur angezeigt, wenn noch keine Konfiguration vorhanden ist. Gleich mehr.<\/p>\n\n\n\n<p>Wenn bereits eine KOnfiguration vorhanden ist, wird sie ausgelesen und angezeigt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ($checkkonfig == 'existiert'){\n\t\techo \"Konfiguration auslesen&lt;\/br&gt;\";\n\t\techo \"Konfiguration: \".get_option('stichwortkonfigexists').\"&lt;\/br&gt;\";\n\t\techo \"Name der CSV-Datei: \".get_option('name_csvdatei').\"&lt;\/br&gt;\";\n\t\techo \"URL der Ausgabeseite: \".get_option('url_ausgabeseite').\"&lt;\/br&gt;\";\n\t\techo \"ID der Ausgabeseite: \".get_option('id_ausgabeseite').\"&lt;\/br&gt;\";\n\t}<\/code><\/pre>\n\n\n\n<p>Das Formular wird nur angezeigt, wenn noch keine Konfiguration vorhanden ist (To Do)&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/***************Begin Formular\n\/\/Formular und Button nur anzeigen, wenn Konfiguration noch nicht existiert\nif ($checkkonfig == \"\"){\n\/\/Formular mit Buttons \n\/\/ Konfiguration speichern schreibt die Parameter in die wp_options\n\necho \"&lt;form action = '#' method = 'post'&gt;\";\n\t\n\techo \"&lt;input type='submit' id='el_button2' name='ButtonKonfig' value='Konfiguration speichern'&gt;\";\n\techo \"&lt;\/form&gt;\";\n\t\n\tif (isset($_POST&#91;'ButtonKonfig'])){\n\t\t\t\n\t\t\treturn konfiguration_speichern();\n\t\t}\n\/\/*****************End Formular\t\n\t\n}<\/code><\/pre>\n\n\n\n<p>Die beim Klicken auf den Button aufgerufene Funktion konfiguration_speichern() macht Folgendes: Sie setzt den Flag stichwortkonfigexists und schreibt den Dateinamen der CSV-Datei in die wp_options. Dann wird die Ausgabeseite neu erstellt, sie kriegt gleich den Shortcode zur Erstellung der Linkliste mit. Dateiname und ID werden in der wp_options gespeichert.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function konfiguration_speichern(){\n\techo \"Ich speichere die Konfiguration\";\n\tadd_option('stichwortkonfigexists', 'existiert');\n\tadd_option('name_csvdatei','stichwortliste.csv');\n\t\n\t\n\t\/\/Hier wird die Ausgabeseite neu erstellt und gleich der Shortcode f\u00fcr die Unterseite mitgegeben\n\t\n\t$my_post = array(\n          'post_title'    =&gt; 'Ausgabeseite f\u00fcr das Stichwortverzeichnis',\n          'post_content'  =&gt; '&#91;links_ausgeben]',\n          'post_status'   =&gt; 'publish',\n          'post_author'   =&gt; 1,\n          'post_category' =&gt; array(1),\n          'post_type'     =&gt; 'page'\n          );\n\n          \/\/ Insert the post into the database\n          \/\/wp_insert_post( $my_post );\n\t\t  $seite_erzeugen = wp_insert_post( $my_post );\n\t\t  \n\t\t  echo $seite_erzeugen;\n\t\t  echo get_permalink($seite_erzeugen);\n\t\t  $guid_seite = get_permalink($seite_erzeugen);\n\t\t  echo \"Seite erzeugt\";\n\t\t  \/\/the_guid($my_post);\n\t\n\t\/\/Ende Ausgabeseite neu erstellen\n\t\n\t\/\/guid und ID in der Tabelle wp_options speichern\n\tadd_option('url_ausgabeseite', $guid_seite);\n\tadd_option ('id_ausgabeseite', $seite_erzeugen);\n\t\n\t\n}\n<\/code><\/pre>\n\n\n\n<p>Das war Teil 1. Ich hol mir mal eine Tasse Tee, Kaffee hab ich heute schon genug gehabt \ud83d\ude42 <\/p>\n\n\n\n<p><strong>Teil 2: die Shortcodes<\/strong><\/p>\n\n\n\n<p>Ich muss meinen umgestrickten PAP nochmal korrigieren: ich erzeuge zwei Shortcodes. den ersten um das Stichwortregister anzuzeigen (Stichworte alfabetisch nach Buchstaben geordnet) und den zweiten um in der Unterseite die Linkliste anzuzeigen.  Frisch ans Werk!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_shortcode( 'el_stichwort', 'el_stichwort_handler_function' );\n\nfunction el_stichwort_handler_function(){\n\techo \"&lt;h2&gt;Stichwortregister&lt;\/h2&gt;\";<\/code><\/pre>\n\n\n\n<p>Jetzt wird die CSV-Datei zeilenweise eingelesen und auf ein Array gelegt. Die Funktion csv_einlesen schenke ich mir, das kann jeder selber komponieren. Hier ist noch eine Debug-Ausgabe mit der Gr\u00f6\u00dfe des fertig eingelesenen Arrays drin.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/Variable f\u00fcr Liste bereitstellen\n\t$listenarray = array();\t\n\t\n\t\/\/csv-Datei einlesen\n\t$listenarray=csv_einlesen();\n\t\n\techo \"Sizeof listenarray :\".sizeof($listenarray).\"&lt;br&gt;\";\n\t<\/code><\/pre>\n\n\n\n<p>Jetzt wirds spannend: ich steppe durch das Alphabet und gebe zu jedem Buchstaben die zugeh\u00f6rigen Stichw\u00f6rter aus. Jedes  Stichwort wird als Link formatiert, der die Unterseite (aus der wp_options) mit dem Parameter stichwort aufruft.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/Array mit Alfabet erzeugen\n\t$alphas = range('A', 'Z');\n\n\t\/\/Durch alfabet durchsteppen\n\tforeach($alphas as $letter){\n\t\t\n\t\t\n\t\techo \"&lt;h3&gt;Buchstabe \".$letter.\"&lt;\/h3&gt;&lt;\/br&gt;\";\n\t\t\n\t\t\/\/Nur einf\u00fcgen, wenn mit dem richtigen Buchstaben anf\u00e4ngt\n\t\tforeach($listenarray as $einwort)\n\t\t{\n\t\t\t\n\t\t\t$hilf = substr($einwort,0,1);\n\t\t\t\n\t\t\t\/\/***** Zeile mit a href und dem richtigen Pfad aufbauen ACHTUNG Absturzgefahr\n\t\t\tif ($hilf == $letter){\n\t\t\t\t\n\t\t\t\t\/\/*****Ausgabeseite wert der Option holen und damit aufmachen\n\t\t\t\t$pfad_unterseite = get_option('url_ausgabeseite');\n\t\t\t\t\t\t\t\t\n\t\t\t\t\/\/Link auf die Unterseite mit \u00dcbergabe des Stichworts als Parameter\n\t\t\t\techo '&lt;a href=\"', \"\".$pfad_unterseite.\"?stichwort=$einwort\",' \",\"&gt;', $einwort, '&lt;\/a&gt;&lt;\/br&gt;';\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t}\/\/ende for each buchstabe\n<\/code><\/pre>\n\n\n\n<p>Schnieke Sache, nicht wahr? Fehlt nur noch der Code zur Erzeugung der Linkliste auf der Unterseite, den muss ich noch ein bisschen bereinigen, der Name der Tabelle Posts ist fest verdrahtet. Aber so funkt es. Ich gehe mit dem Stichwort zuerst ins Feld post_title und gebe die Treffer aus, dann gehe ich nochmal rein, in das Feld post_content  (und nicht wie post_title) und gebe die ebenfalls aus. Thazzit!<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/**********************Beginn Shortcode f\u00fcr die Ausgabe der Stichwortliste erzeugen To Do: Tabellenname iiiwpposts als Var generieren\nadd_shortcode( 'links_ausgeben', 'links_ausgeben_handler_function' );\n\nfunction links_ausgeben_handler_function(){\n\techo \"&lt;h2&gt;Hier kommt die Linkliste:&lt;\/h2&gt;\";\n\t\n\t$aktStichwort = $_GET&#91;'stichwort'];\n\t\/\/echo $aktStichwort;\n\necho \"&lt;h3&gt;\".$aktStichwort.\"&lt;\/h3&gt;\";\n$neu=$aktStichwort;\n\nglobal $wpdb;\n\n\/\/erst treffer aus dem Titel rausfischen\n$alleposts = $wpdb-&gt;get_results(\"SELECT DISTINCT(post_title), guid from iii_wpposts where post_title like '%$neu%' and post_status = 'publish' and post_type = 'post'\");\n\nforeach ( $alleposts as $einpost ) \n{ \n  \/\/echo $einpost-&gt;post_title, $einpost-&gt;guid.\"&lt;br&gt;\";\n\techo '&lt;a href=\"', $einpost-&gt;guid, '\/\",\"&gt;', $einpost-&gt;post_title, '&lt;\/a&gt;&lt;\/br&gt;';\n\n}\n\n\n\/\/dann treffer aus dem content ohne treffer aus dem title rausfischen(dubletten vermeiden)\n$alleposts = $wpdb-&gt;get_results(\"SELECT DISTINCT(post_title), guid from iii_wpposts where post_title not like '%$neu%' and post_content like '%$neu%' and post_status = 'publish' and post_type = 'post'\");\n\nforeach ( $alleposts as $einpost ) \n{ \n \/\/ echo $einpost-&gt;post_title, $einpost-&gt;guid.\"&lt;br&gt;\";\n\techo '&lt;a href=\"', $einpost-&gt;guid, '\/\",\"&gt;', $einpost-&gt;post_title, '&lt;\/a&gt;&lt;\/br&gt;';\n\n}\n}\/\/**********************Ende Shortcode f\u00fcr die Ausgabe der Stichwortliste erzeugen<\/code><\/pre>\n\n\n\n<p>Jetzt fehlen noch ein paar Screenshots, aber daf\u00fcr gibts einen neuen Beitrag.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nat\u00fcrlich hab ich (design as you go) den PAP noch ein paar mal radikal ge\u00e4ndert und das Konzept einige Male wieder \u00fcber den Haufen geschmissen. Aber jetzt l\u00e4uft zumindest eine Rohfassung, und die m\u00f6chte ich euch nicht vorenthalten. Was bei mir wie immer fehlt ist eine Foolproof Fehlerbehandlung, da m\u00fcsste man noch einiges tun. So [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1630"}],"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=1630"}],"version-history":[{"count":4,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1630\/revisions"}],"predecessor-version":[{"id":1634,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1630\/revisions\/1634"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=1630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=1630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=1630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}