In WordPress einen Shortcode zu erzeugen ist recht einfach. Man fügt einfach folgenden Code ein:
//**********************Beginn Shortcode erzeugen
add_shortcode( 'shortcode_name', 'shortcode_handler_function' );
function shortcode_handler_function(){
echo "Ich bin dein Shortcode";
}
//***************End Shortcode erzeugen
Jetzt an beliebiger Stelle in einem Beitrag oder auf einer Seite das Kürzel [shortcode_name] einfügen und hoffen dass es funkt… ich hab da öfter eine JSON-Fehlermeldung, die sich durch ab- und wieder anmelden oder Plugin neu aktivieren beheben liess, aber nicht immer. WordPress kann auch sehr zickig sein wenn man versucht einen Shortcode umzubenennen, da gibts gern mal chaotische Fehlermeldungen. Sei’s drum.
Ich habe mich dafür entschieden ein eigenes Plugin für die Erzeugung des Shortcodes zu erstellen, dann hab ich den Code sauber getrennt und tu mir leichter mit dem Fehlerkorrigieren. Der Shortcode soll die CSV-Datei mit den Stichworten zeilenweise einlesen und in ein Array schreiben, daraus basteln wir dann das alfabetisch sortierte Stichwortverzeichnis mit den Links. Wie ich das mit der Unterseite löse weiß ich noch nicht, da heißts design as you go 🙂
Aber jetzt wollen wir mal.
Zuerst mal müssen wir unsere CSV-Datei einlesen und den Inhalt auf eine Array-Variable legen. Das geht zum Beispiel so:
//Variable für Liste bereitstellen
$listenarray = array();
//csv-Datei einlesen
$listenarray=csv_einlesen();
Die Funktion csv_einlesen sieht dann so aus:
function csv_einlesen(){
//Verzeichnis ermitteln
$dir = plugin_dir_path( __FILE__ );
$aktVerzeichnis = $dir;
//Der Name der CSV-Datei ist fest verdrahtet, das wäre nice to have anders
$neuName = $aktVerzeichnis.'stichwortliste.csv';
echo "Lese aus Datei ".$neuName."</br>";
//Array anlegen
$aktListe = array();
// Datei öffnen, $handle ist der Dateizeiger
$handle = fopen ($neuName,'r');
//Solange nicht EOF erreicht, 1000 ist die maximale Zeilenlänge
while (($csv_array = fgetcsv ($handle, 1000)) !== FALSE ) {
foreach ($csv_array as $index) {
//echo $index . '<br>';
//Hier kommt der Knackpunkt: Neues Stichwort in Array schreiben
//***********************************
array_push($aktListe, $index);
//***********************************
}
}
fclose($handle);
//Debug-Ausgabe
echo "Array eingelesen, Anzahl der Wörter: ".sizeof($aktListe)."</br>";
return $aktListe;
}//Ende csv_einlesen
Das ist jetzt nicht weiter tragisch, der Witz ist dass das Array mit den eingelesenen Stichwörtern als Rückgabewert der Funktion dient. Damit können wir weiterarbeiten.
Als nächstes bauen wir ein schönes, alfabetisch geordnetes Stichwortverzeichnis auf, dazu brauchen wir zunächst mal ein Array mit allen Buchstaben des Alphabets. Durch das steppen wir durch und geben die Stichworte aus, wenn sie mit dem richtigen Buchstaben anfangen.
//Stichworte Alfabetisch gruppiert ausgeben
//Array mit Alfabet erzeugen
$alphas = range('A', 'Z');
//Durch alfabet durchsteppen
foreach($alphas as $letter){
echo "<h2>Buchstabe ".$letter."</h2></br>";
//Nur einfügen, wenn mit dem richtigen Buchstaben anfängt
foreach($listenarray as $einwort)
{
$hilf = substr($einwort,0,1);
if ($hilf == $letter){
echo $einwort."</br>";
//************************************************To Do: Link erzeugen
}
}
}//ende for each buchstabe
Dann hörts aber auf. Ich suche noch nach einer eleganten Möglichkeit, die Liste als Links zu formatieren, die dann eine Unterseite aufmachen. Auf der Unterseite sollen natürlich alle Rezepte zum gewählten Stichwort angezeigt werden. Das funktioniert, solange ich eine statische Seite generiere und deren URL fest verdrahtet mitgebe, der Code für den Link sieht dann so aus:
echo '<a href="', "http://localhost:819/inselfisch-kochbuch/alle-eintraege-zu-stichwort/?stichwort=$einwort'",' ",">', $einwort, '</a></br>';
Das ist jetzt aber nicht der Weisheit letzter Schluss, fest verdrahtete Dateinamen sind ganz, ganz schlechter Stil. Da muss ich mir was anderes einfallen lassen. Ich hab jetzt mal eine Anfrage im deutschen WordPress-Forum gestartet, mal schauen ob da was dabei rauskommt. Einstweilen: einen frischen Kaffee!