Archiv der Kategorie: Allgemein

Stichwortverzeichnis Negativliste: wir basteln uns einen Tabelleneditor

Ich bin mir ziemlich sicher dass ich sowas in der Art schon mal gemacht habe, aber ich finde es nicht mehr. Na ja, das übt und ist eine hübsche kleine Fingerübung. Ich mach mal einen kurzen PAP:

  • Die Tabelle für die Negativliste wird beim Setup des Stichwort-Plugins mit angelegt und mit einigen wenigen Beispieleinträgen befüllt. Jedenfalls gehe ich davon aus, dass sie schon existiert.
  • Es gibt einen neuen Admin-Menüpunkt Negativliste bearbeiten. Hier wird die existierende Liste tabellarisch angezeigt.
  • Es gibt bei jedem Datensatz einen Button „Löschen“ (mit Rückfrage)
  • Es gibt unterhalb der Tabelle einen Button „Neues Wort eintragen“
  • Die Buttons machen jeweils eine Unterseite auf, auf der die gewählte Aktion nochmal bestätigt wird.

Das wars eigentlich schon. Dann wollen wir mal. Zuerst kommen die Einträge für das Admin-Menü:

add_action('admin_menu', 'negativliste_plugin_setup_menu');

function negativliste_plugin_setup_menu(){
add_menu_page( 'Negativliste', 'Negativliste bearbeiten', 'manage_options', 'negativliste', 'negativliste_init' );
add_submenu_page('Negativliste', 'Eintragen', 'Eintragen', 'manage_options', 'eintragen', 'eintragen_function');
add_submenu_page('Negativliste', 'Loeschen', 'Loeschen', 'manage_options', 'loeschen', 'loeschen_function');
}

Schauen wir uns als erstes mal die Funktion negativliste_init an. Zuerst wird gecheckt, ob die Tabelle negativliste schon vorhanden ist:

//Überprüfen ob Tabelle schon existiert
$table_exists = $wpdb->get_var( "SHOW TABLES LIKE 'negativliste'" ); 

if ($table_exists == "") {
echo "Tabelle negativliste existiert noch nicht";
... (hier kann die Tabelle neu erstellt werden)


Da muss ich nochmal ran, eigentlich sollte die Tabelle beim Initialisieren des Plugins Stichworttabelle mit angelegt werden. Hier nur mal Interessehalber der Code zum Erstellen:

//Begin function tabelle_erzeugen - legt die Tabelle negativliste mit einem Feld "wort" an
function tabelle_erzeugen(){

global $wpdb;

$charset_collate = $wpdb->get_charset_collate();

$sql = "CREATE TABLE negativliste (
wort text
) $charset_collate;";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

} //End function tabelle_erzeugen

Interessant wirds im Else-Zweig der Funktion, da  kommt die Datenbankabfrage und der Aufbau der Tabelle zur Anzeige. Ich schau erst mal nach, ob die Tabelle überhaupt Datensätze hat und baue die Tabelle nur auf, wenn es mehr als 0 Datensätze sind:

function tabelle_bearbeiten(){

global $wpdb;
//Datensätze zählen & Ausgabe Anzahl
$count_query = "select count(*) from negativliste";
$num = $wpdb->get_var($count_query);
echo $num."&nbsp Einträge gefunden</br>";

if ($count_query <> 0) {

$anzeige_query = $wpdb->get_results("SELECT wort FROM negativliste ORDER BY wort");
...

So wird der Tabellenhead zusammengebaut:

echo "<table border='1' cellpadding='5'>
<tr>
<th>Wort</th>
<th>delete</th>
</tr>";

Danach steppe ich durch alle gefundenen Datensätze durch und baue ein Formular mit einem Löschen-Button zusammen. Der Button ruft die Unterseite loeschen auf und gibt als Parameter das aktuelle Wort mit.

echo "<form method='post'>";
foreach ($anzeige_query as $dsatz) {
echo "<tr>";
$id = $dsatz->wort;

echo "<td>" . $dsatz->wort . "</td>";
echo "</td>" .
"<td><input type='submit' name='löschen' formaction='admin.php?page=loeschen&aktuell=".$id."' value='löschen'></td>" .

"</tr>";
}// ende von foreach dsatz

Jetzt kommt nur noch ein Link zur der Seite auf der man einen neuen Datensatz eintragen kann, dann wars das auch schon:

echo "<p><input type='submit' name='eintragen' formaction='admin.php?page=eintragen' value='Neues Wort eintragen'></p></form> ";

Jetzt fehlen noch die Funktionen zum Eintragen eines neuen Datensatzes und zum Löschen des gewählten Datensatzes. Zuerst die zum Eintragen:

Zuerst wird ein kleines Formular aufgebaut: es gibt ein Textfeld, in das man das neue Wort eintragen kann, und einen Button zum Speichern. Wenn auf diesen Button geklickt wird, wird der Insert aufgerufen und kriegt das Wort als Parameter mit.

if (isset($_POST['neuesWortEintragen'])){
			$aktWort = $_POST["wort"];
			echo "Neues Wort ".$aktWort." wird eingetragen";
			
	// Insert-Anweisung erstellen
    $check = $wpdb->insert( 'negativliste', array( 'wort' => ''.$aktWort.'' ) );

    if($check) {
        echo "Ein neuer Datensatz erfolgreich hinzugefügt";
    }
	} // ende von isset 

Dann kommt noch ein Link zurück zum Hauptformular, und das wars.

 

echo "</form>";

echo "<a href='admin.php?page=negativliste'>Zurück zur Übersicht</a>";

Das Formular zum Löschen eines Datensatzes sieht ganz ähnlich aus, das Textfeld ist allerdings schreibgeschützt, es dient nur zur Anzeige des als Parameter übergebenen Worts.

function loeschen_function(){

global $wpdb;

$aktWort = $_GET['aktuell'];
echo $aktWort." wird gelöscht";

echo "<h2><Löschen</h2>";

echo "<form action='admin.php?page=loeschen&aktuell='".$aktWort."' method='post'>";
echo "<p><input name='wort' type='text' value = '$aktWort' readonly></p>";
echo "<p><input type='submit' name='WortLoeschen' value='Wort löschen'></p>";
...

Wenn auf den Button „Wort Löschen“ geklickt wird, triggert der Delete-Befehl:

if (isset($_POST['WortLoeschen'])){
$aktWort = $_POST["wort"];
echo "Wort ".$aktWort." wird gelöscht</br>";

// Delete-Anweisung erstellen
$check=$wpdb->query("DELETE FROM negativliste WHERE wort = '$aktWort'");

if($check) {
echo "Ein Datensatz erfolgreich gelöscht";
}
echo "</form>";

Auch hier kommt noch der Link zurück zur Übersicht, und das wars.  Jetzt fehlen noch ein paar Screenshots, aber dafür gibts einen neuen Beitrag.

Inhaltsverzeichnis revisited: wg PHP 8 und sauber als Shortcode

Ich hab mir schon vor Jahren ein Inhaltsverzeichnis für meine WordPress-Webseiten gebastelt, das hatte ich damals mit PHP Code for Posts realisiert. Jetzt bei der Umstellung auf PHP 8 fällt es auf die Nase, ich musste es also eh noch mal überarbeiten. Es war ein relativ kleines Problem: ich hab in den Funktionsaufrufen für die Ausgabe pro Buchstabe keine Hochkommata für den Parameter dringehabt, das sah so aus:

BuchstabenAusgabe(A);

PHP 8 hätte es aber gern so:

BuchstabenAusgabe("A");

Bei der Gelegenheit hab ich es gleich in einen Shortcode gepackt und den Aufruf der Ausgabe mit einem Array gelöst, und weils so schön geklappt hat gehen wir es hier mal im Galopp nochmal durch.

Als Erstes kommt der Plugin-Header und die Definition des Shortcodes:

/*
Plugin Name: Inhaltsverzeichnis
Plugin URI: http://localhost/zum-schwarzen-pinguin/wp-content/plugins/inhaltsverzeichnis
Description: Erzeugt einen Shortcode [el_inhaltsverzeichnis] , der ein Inhaltsverzeichnis aller veröffentlichten Beiträge aus der Tabelle posts erstellt
Version: 3.0
Author: Evi Leu
Author URI: http://www.evileu.de
*/
add_shortcode( 'el_inhaltsverzeichnis', 'el_inhaltsverzeichnis_handler_function' );
function el_inhaltsverzeichnis_handler_function(){
echo "<h2>Inhaltsverzeichnis</h2>";...

Dann rufe ich die Funktion zur buchstabenweisen Ausgabe mit Hilfe eines Arrays für das Alfabet auf:

//Array mit Alfabet erzeugen
$alphas = range('A', 'Z');

//Durch alfabet durchsteppen
foreach($alphas as $letter){
//Alle Beiträge zu einem Buchstaben ausgeben
BuchstabenAusgabe("$letter");
}

Mit dem Buchstaben gehe ich in die Tabelle posts und hole mir die passenden Einträge heraus. Daraus wird eine Liste mit Links erzeugt, das geht schön mit der guid.

function BuchstabenAusgabe($aktBuchstabe){
global $wpdb;

//Beginn Originalcode
$table_name = $wpdb->prefix . 'posts';

//Datensätze zählen & Ausgabe Anzahl

$count_query = "select count(*) from $table_name where post_status='publish' and post_type = 'post' and post_title like '$aktBuchstabe%'";
$num = $wpdb->get_var($count_query);

//Ausgabe nur wenn auch Datensätze vorhanden sind
if ($num>0) { 
echo "<h2>$aktBuchstabe:&nbsp".$num."&nbsp Beiträge</h2>";

//Alle Datensätze vom Typ post und published ausgeben

$alleposts = $wpdb->get_results( "SELECT post_title, 
post_status, post_type,
guid FROM $table_name
where post_status='publish' and post_type = 'post' and post_title like '$aktBuchstabe%'
order by post_title");

foreach ( $alleposts as $einpost ) 
{ 
echo '<a href="', $einpost->guid, '/",">', $einpost->post_title, '</a></br>';

}

} //Ende if Anzahl grösser Null
//Ende Originalcode
}//ende function BuchstabenAusgabe

Das wars schon, Shortcode an beliebiger Stelle einsetzen und schwupps hat man ein schönes Inhaltsverzeichnis.

Xampp ist schon Klasse!

Jetzt hab ich mal den grossen Sprung gewagt und meinen lokalen Webserver neu installiert, weil ich ab jetzt mit PHP 8 arbeiten möchte. Ich hab mir den neuesten Xampp bei Chip runtergeladen, das alte Verzeichnis gesichert (lief schlappe 3 Stunden für gut 2 Gig) Xampp deinstalliert und neu installiert. Das hat zwar auch etwas länger gedauert, ist aber problemlos verlaufen. Das Control Panel musste ich dann zwar als Admin starten, aber das ist nur eine Kleinigkeit. Der Webserver lief auf Anhieb, ich hab dann gleich mal mit dem Duplicator den schwarzen Pinguin draufgenudelt – das hat gedauert! Am Anfang gabs zwar eine Fehlermeldung dass ein ZIP-Dienst nicht verfügbar wäre, aber dazu kam auch der Tipp dass man das Paket manuell entpacken könnte und den Installer dann nochmal starten kann. Lief problemlos durch – dauerte aber schon eine halbe Stunde.  Na fein, scheint alles zu laufen. Jetzt geh ich nochmal meine Plugins testen.

Lokaler Test auf dem Praxis-Blog

The good news first: das erste Plugin Stichworttabelle lief ohne Fehler durch und hat die CSV-Datei einwandfrei erzeugt.

Das zweite Plugin StichwortShortcode warf bei der Aktivierung einen Fehler: „Das Plugin erzeugte 2 Zeichen mit unerwarteter Ausgabe während der Aktivierung. Wenn du „headers already sent“-Hinweise, Probleme mit Syndication-Feeds oder andere Probleme bemerkst, versuche, dieses Plugin zu deaktivieren oder zu entfernen.“

Das ist natürlich weniger schön, aber dieser Fehler ist notorisch schwer zu lokalisieren, ich habs mal trotzdem aufgerufen. Erst die Konfiguration gespeichert, dann den Shortcode in eine neue Seite eingefügt – was soll ich sagen, hat auf Anhieb gefunkt und ein schönes Stichwortregister erzeugt. Das Einzige was mir dabei nicht so gut gefallen hat: bei diesem Blog sind jede Menge groß geschriebene Füllwörter mit reingerutscht (Und, So, Da,..) da brauchts eine Negativ-Liste. Da muss ich mal meinen Grips arbeiten lassen, das wäre schon very nice to have.

Das ist mir jetzt schon direkt ein bisschen unheimlich, normalerweise gehen bei solchen ersten Tests immer jede Menge Dinge schief und man kriegt -zig Fehlermeldungen. War nicht, ich hab anscheinend recht sauber programmiert.

Jetzt auf zu neuen Ufern: wie mach ich das mit der Negativ-Liste?

Aber ehrlich gesagt: ich muss zuerst bei der Konfiguration des Shortcode Plugins nochmal ran. Man sollte schon eine bestehende Konfiguration löschen und neu erzeugen können, da muss ich an der Benutzerführung noch was tun. Und vielleicht sollte ich mir auch Gedanken darüber machen, wie die CSV-Datei ins richtige Verzeichnis kommt. Ach ja, mir wird nicht langweilig 😉

Wenns so einfach wäre: die Tücken der lokalen WordPress-Installation

Ich gebs zu, ich hatte es mir einfacher vorgestellt, eine lokale Kopie dieses Blogs anzulegen. Dateien per SFTP runterladen… hat fast eine Stunde gedauert, war aber noch OK. Datenbankbackup einspielen… das ging recht flott, so nach 10 Minuten war MySQL damit fertig. wp_config anpassen (Datenbank Name, User Pwd etc.). Pfade in der wp_options anpassen. Dann liefs, aber mein Plugin lief nicht. Doch es lief so prinzipiell schon, die Erstellung der CSV-Datei aus den Beitragstiteln lief ohne Fehler durch. Aber später bei der Anzeige der Linkliste gabs Probleme. Die guid aus der wp_posts stand natürlich überall noch mit dem Serverpfad drin, da machte ein Klick die Life-Installation auf und zeigte brav den passenden Eintrag an. Menno, ich will aber die lokalen Beiträge haben…

In diesem gewohnt informativen Beitrag bei elmastudio wird vorgeschlagen, die Pfade in der Datenbank Backup Datei mit Hilfe von Notepad++ Suchen&Ersetzen anzupasssen und die Tabellen erst dann zu importieren. War ich wieder zu schnell.. also, Tabellen nochmal droppen und neuer Versuch. Ich melde mich dann wieder.

Also, nach mehreren vergeblichen Versuchen eine Webseite manuell umzuziehen ist es mir jetzt zu dumm geworden, und ich hab mich an das Plugin Duplicator erinnert, das besonders für kleinere Webseiten 1a geeignet ist. Hier bei Weptimizer findet man eine ausführliche Anleitung. Ich hab jetzt meinen Praxis Dr. Inselfisch Blog lokal umgezogen und geh mal mein Plugin testen.

Nachtrag: der Duplicator ist schon Klasse, er hat mir diesen Blog hier klaglos auf meinen lokalen Webserver umgezogen, auch wenn das Einspielen von 94 MB gezipptem Archiv schon ein Stück gedauert hat. Tolles Plugin, wirklich!

Diesmal war ich schneller: der neue Widget-Editor ist auch buggy

Ich habe mir gerade eine lokale Sicherungskopie dieses Blogs erstellt, weil ich damit mein Stichwort-Plugin testen möchte. Siehe hierzu übrigens folgende sehr informative Seite: bestehendes WordPress Blog…lokal kopieren (schon etwas älter, funkt aber)

Und, was soll ich sagen: ich wollte die Widgets anpassen, weil ein paar davon Fehlermeldungen geschmissen haben, und der Widget-Editor kam im neuen Gewand als Blockeditor und hat Kraut, Rüben und Fehler geliefert. Flugs das Plugin Classic Widget gesucht, gefunden und installiert, und schon läuft es wieder rund mit den Widgets. Oh Mann… ich liebe Gutenberg wirklich! 😉

Mal gucken, wie stabil der lokale Blog läuft, ich werde jetzt testen ob mein Stichwort Plugin tut was es soll. Es bleibt spannend!

Stichwortverzeichnis: so siehts aus (Screenshots)

Man nehme: den Shortcode [el_stichwort] und füge ihn in einer Seite deiner Wahl ein:

Das erzeugt zunächst aus der CSV-Datei ein Stichwortregister mit weiterführenden Links:

Screenshot Stichwortregister

Klick auf ein Stichwort öffnet eine Linkliste mit den zu diesem Stichwort gefundenen Rezepten:

Klick auf den Link öffnet das Rezept:

Screenshot Rezept

Eine runde Sache, und wenn ichs selber sage. Es ist noch ein bisschen Feinarbeit nötig, evtl. Sollte ich meine beiden Plugins zusammenfassen, aber das ist mir bei meiner mangelnden Fehlerbehandlung zu tricky. Eigentlich kam ich auf die Idee mit der Aufteilung in zwei Plugins daher, dass ich dank Gutenberg ständig Fehler bei der Shortcode-Ausführung hatte. Muss man sich mal vorstellen… das ist schon schwer buggy.

Ich lass es jetzt erstmal gut sein. Es war ein spannendes Projekt. Vielleicht mach ich noch die Positiv/Negativliste, wenns mich anspringt, aber jetzt ist erst mal Pause.

Jetzt aber: wir erstellen ein Stichwortverzeichnis mit Linkliste

Natürlich hab ich (design as you go) den PAP noch ein paar mal radikal geändert und das Konzept einige Male wieder über den Haufen geschmissen. Aber jetzt läuft zumindest eine Rohfassung, und die möchte ich euch nicht vorenthalten. Was bei mir wie immer fehlt ist eine Foolproof Fehlerbehandlung, da müsste man noch einiges tun. So wie es ist kann man das Ding keinesfalls in einer echten, life WordPress Installation verwenden, das wäre selbstmörderisch. Aber auf meinem lokalen Webserver ist es gut aufgehoben und kann als Ausgangsmaterial für ein vernünftiges Plugin dienen.

Die wichtigsten Punkte in meinem umgearbeiteten PAP im Überblick:

  • es gibt zwei Plugins. Eins erstellt die CSV-Datei mit den Stichworten aus den Titeln der Beiträge. Das zweite erzeugt eine Konfiguration für die Ausgabe (später mehr) und stellt einen Shortcode bereit, der das Stichwortverzeichnis an einer beliebigen Stelle (Seite) erzeugt.
  • 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übsch alfabetisch sortiertes Stichwortregister. Klick auf ein Stichwort öffnet eine Unterseite und gibt als Parameter das aktuelle Stichwort mit.
  • Damit eine Liste der gefundenen Beiträge 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ält nur einen Shortcode, der den beim Aufruf übergebenen Parameter stichwort übernimmt und daraus eine Liste der Beiträge zu diesem Stichwort erstellt. Die ID und der Permalink dieser Seite werden in der wp_options gespeichert. Diese Seite taucht auch ganz normal unter „Alle Seiten“ auf. Wenn man sie löscht – Pech. Da fehlt wieder die Fehlerbehandlung.
  • Vorläufig gibt es keine Möglichkeit, die Konfiguration des zweiten Plugins nachträglich zu ändern. Für Entwickler: man kann die Einträge in der wp_options manuell löschen, dann kann man die Konfiguration neu schreiben. Das sollte man aber nicht im laufenden Betrieb tun, Pfusch auf der Datenbank kann zu Serverabstürzen führen. Hier To Do.

So, genug ge-PAP-t. Jetzt wollen wir uns mal das Plugin ShortcodeStichwort näher ansehen.

Teil 1 die Konfiguration

Ich erzeuge zunächst einen Eintrag im Admin-Menü, wie gehabt:

//********************* Eintrag im Adminmenü erzeugen
  add_action('admin_menu', 'shortcodestichwort_plugin_setup_menu');
	
	function shortcodestichwort_plugin_setup_menu(){
    add_menu_page( 'ShortcodeStichwort', 'Shortcode Stichwort Konfiguration', 'manage_options', 'shortcodestichwort', 'shortcodestichwort_init' );
}

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:

function shortcodestichwort_init(){
	echo "<h2>Konfiguration für die Ausgabe Stichwortverzeichnis</h2>";
	
	//Prüfen, ob bereits eine Konfiguration gespeichert wurde
	$checkkonfig = get_option('stichwortkonfigexists');
	
	if ($checkkonfig == ""){
	echo "Noch keine Konfiguration gespeichert. Sie müssen einmal auf den Button Konfiguration speichern klicken. ";}

Der Button „Konfiguration speichern“ wird nur angezeigt, wenn noch keine Konfiguration vorhanden ist. Gleich mehr.

Wenn bereits eine KOnfiguration vorhanden ist, wird sie ausgelesen und angezeigt:

if ($checkkonfig == 'existiert'){
		echo "Konfiguration auslesen</br>";
		echo "Konfiguration: ".get_option('stichwortkonfigexists')."</br>";
		echo "Name der CSV-Datei: ".get_option('name_csvdatei')."</br>";
		echo "URL der Ausgabeseite: ".get_option('url_ausgabeseite')."</br>";
		echo "ID der Ausgabeseite: ".get_option('id_ausgabeseite')."</br>";
	}

Das Formular wird nur angezeigt, wenn noch keine Konfiguration vorhanden ist (To Do)…

//***************Begin Formular
//Formular und Button nur anzeigen, wenn Konfiguration noch nicht existiert
if ($checkkonfig == ""){
//Formular mit Buttons 
// Konfiguration speichern schreibt die Parameter in die wp_options

echo "<form action = '#' method = 'post'>";
	
	echo "<input type='submit' id='el_button2' name='ButtonKonfig' value='Konfiguration speichern'>";
	echo "</form>";
	
	if (isset($_POST['ButtonKonfig'])){
			
			return konfiguration_speichern();
		}
//*****************End Formular	
	
}

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.

function konfiguration_speichern(){
	echo "Ich speichere die Konfiguration";
	add_option('stichwortkonfigexists', 'existiert');
	add_option('name_csvdatei','stichwortliste.csv');
	
	
	//Hier wird die Ausgabeseite neu erstellt und gleich der Shortcode für die Unterseite mitgegeben
	
	$my_post = array(
          'post_title'    => 'Ausgabeseite für das Stichwortverzeichnis',
          'post_content'  => '[links_ausgeben]',
          'post_status'   => 'publish',
          'post_author'   => 1,
          'post_category' => array(1),
          'post_type'     => 'page'
          );

          // Insert the post into the database
          //wp_insert_post( $my_post );
		  $seite_erzeugen = wp_insert_post( $my_post );
		  
		  echo $seite_erzeugen;
		  echo get_permalink($seite_erzeugen);
		  $guid_seite = get_permalink($seite_erzeugen);
		  echo "Seite erzeugt";
		  //the_guid($my_post);
	
	//Ende Ausgabeseite neu erstellen
	
	//guid und ID in der Tabelle wp_options speichern
	add_option('url_ausgabeseite', $guid_seite);
	add_option ('id_ausgabeseite', $seite_erzeugen);
	
	
}

Das war Teil 1. Ich hol mir mal eine Tasse Tee, Kaffee hab ich heute schon genug gehabt 🙂

Teil 2: die Shortcodes

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!

add_shortcode( 'el_stichwort', 'el_stichwort_handler_function' );

function el_stichwort_handler_function(){
	echo "<h2>Stichwortregister</h2>";

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öße des fertig eingelesenen Arrays drin.

//Variable für Liste bereitstellen
	$listenarray = array();	
	
	//csv-Datei einlesen
	$listenarray=csv_einlesen();
	
	echo "Sizeof listenarray :".sizeof($listenarray)."<br>";
	

Jetzt wirds spannend: ich steppe durch das Alphabet und gebe zu jedem Buchstaben die zugehörigen Stichwörter aus. Jedes Stichwort wird als Link formatiert, der die Unterseite (aus der wp_options) mit dem Parameter stichwort aufruft.

//Array mit Alfabet erzeugen
	$alphas = range('A', 'Z');

	//Durch alfabet durchsteppen
	foreach($alphas as $letter){
		
		
		echo "<h3>Buchstabe ".$letter."</h3></br>";
		
		//Nur einfügen, wenn mit dem richtigen Buchstaben anfängt
		foreach($listenarray as $einwort)
		{
			
			$hilf = substr($einwort,0,1);
			
			//***** Zeile mit a href und dem richtigen Pfad aufbauen ACHTUNG Absturzgefahr
			if ($hilf == $letter){
				
				//*****Ausgabeseite wert der Option holen und damit aufmachen
				$pfad_unterseite = get_option('url_ausgabeseite');
								
				//Link auf die Unterseite mit Übergabe des Stichworts als Parameter
				echo '<a href="', "".$pfad_unterseite."?stichwort=$einwort",' ",">', $einwort, '</a></br>';
			
			}
			
		}
		
		
	}//ende for each buchstabe

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!

//**********************Beginn Shortcode für die Ausgabe der Stichwortliste erzeugen To Do: Tabellenname iiiwpposts als Var generieren
add_shortcode( 'links_ausgeben', 'links_ausgeben_handler_function' );

function links_ausgeben_handler_function(){
	echo "<h2>Hier kommt die Linkliste:</h2>";
	
	$aktStichwort = $_GET['stichwort'];
	//echo $aktStichwort;

echo "<h3>".$aktStichwort."</h3>";
$neu=$aktStichwort;

global $wpdb;

//erst treffer aus dem Titel rausfischen
$alleposts = $wpdb->get_results("SELECT DISTINCT(post_title), guid from iii_wpposts where post_title like '%$neu%' and post_status = 'publish' and post_type = 'post'");

foreach ( $alleposts as $einpost ) 
{ 
  //echo $einpost->post_title, $einpost->guid."<br>";
	echo '<a href="', $einpost->guid, '/",">', $einpost->post_title, '</a></br>';

}


//dann treffer aus dem content ohne treffer aus dem title rausfischen(dubletten vermeiden)
$alleposts = $wpdb->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'");

foreach ( $alleposts as $einpost ) 
{ 
 // echo $einpost->post_title, $einpost->guid."<br>";
	echo '<a href="', $einpost->guid, '/",">', $einpost->post_title, '</a></br>';

}
}//**********************Ende Shortcode für die Ausgabe der Stichwortliste erzeugen

Jetzt fehlen noch ein paar Screenshots, aber dafür gibts einen neuen Beitrag.

Danke, Gutenberg! Wenn Shortcodes nicht funzen…

… nehme man den Classic Editor. Nee, ohne Schmarrn, dem ist so. Ich hab gestern gedacht ich werde noch wahnsinnig, meine Shortcodes tun nicht das was sie sollen, ich krieg ständig diese bescheuerten JSON-Fehler. Permalinks neu erstellt, an- und abgemeldet, Webserver neu gestartet, half alles nix. Bis ich dann beim googlen auf den Hinweis gestossen bin, dass man auf den Classic Editor zurückswitchen soll, wenn diese Fehler auftreten.

Gesagt, getan. Und was soll ich sagen? Jetzt funken meine Shortcodes wieder. Das darf doch wohl nicht wahr sein! Ist natürlich verdammt ärgerlich. Und ich weiss nicht, ob ich bei meinen Life-Blogs wirklich auf den Classic Editor umstellen möchte, das muss ich mir noch schwer überlegen. Ist schon ein dicker Hund.

Stichwortverzeichnis: ich brauche einen neuen PAP

Tja, so kanns gehen. Meine Recherchen haben ergeben, das ich um eine eigens erstellte Ausgabeseite für das Stichwortverzeichnis nicht herumkomme. Mir schwebt da eine Lösung vor, dass ich den Plugin-Admin-Menüpunkt um eine Funktionalität erweitere: „Konfiguriere Ausgabeseite“. Da kann ich auf folgendes Snippet zurückgreifen:

$my_post = array(
          'post_title'    => 'hello',
          'post_content'  => 'This is my post.',
          'post_status'   => 'publish',
          'post_author'   => 1,
          'post_category' => array(1),
          'post_type'     => 'page'
          );

          // Insert the post into the database
          wp_insert_post( $my_post );

Dann müsste ich eigentlich die URL der neu erstellten Seite abgreifen können, und die wiederum könnte ich für die Erzeugung der Links verwenden. In die Seite muss natürlich noch ein Shortcode rein, der den übergebenen Parameter Stichwort auffängt und damit eine Liste der zu diesem Stichwort gefundenen Beiträge erstellt. Mit LInks aus der guid natürlich.

Halbwegs klar? Ich muss mir natürlich merken, wie meine Seite heißt und was sie für eine URL gekriegt hat, das erledige ich wahrscheinlich mit einem Eintrag in der wp_options. Da müsste ich sowieso ein paar Init-Werte reinschreiben, wie den CSV-Dateinamen, aber das ist nur so ein Randgedanke. Ich kann mir dann die Möglichkeit offenhalten, eine bereits existierende Ausgabeseite beizubehalten oder zu ersetzen, da muss ich mal gucken wie weit ich komme. Hach ja, morgen ist auch noch ein Tag. Es bleibt spannend.