Ubuntu 22.04: erster Eindruck

Ich hab das Betriebssystem nicht selber installiert, es soll aber recht unproblematisch sein, es auf einen bootfähigen USB-Stick zu installieren und von da aus aufzuspielen. Ich werde eine Anleitung nachreichen.

Es braucht eine Weile zum Hochfahren, ähnlich wie Windows. Dann der erste Eindruck: ein aufgeräumter Desktop, links eine Leiste mit Programm-Icons, oben links ein Wort „Aktivitäten“ und links unten ein Kästchen das sich mit „Anwendungen anzeigen“ meldet, wenn man mit der Maus drüberfährt. Ich ruf mal den Firefox auf, Sieht genauso aus wie unter Windows. Dann ruf ich noch den Dateimanager auf, der kommt etwas spartanisch daher. Das Hauptverzeichnis heißt hier „Persönlicher Ordner“, darunter sind bereits mehrere gängige Unterverzeichnisse angelegt, Dokumente, Bilder, Videos etc… Es gibt hier auch einen Papierkorb. Ich empfehle, die vorgefertigte Ordnerstruktur auch zu benutzen, damit man den Überblick behält.

Wenn ich wieder zu Firefox wechsle, geht der Dateimanager in den Hintergrund. Wie krieg ich ihn wieder her? Ah, mit der Windows-Taste oder mit einem Klick auf „Aktivitäten“ bekommt man eine Übersicht aller geöffneten Programme und kann mit Mausklick wechseln. Das muss man natürlich wissen.

Wenn ich „Anwendungen anzeigen“ aufrufe, kommt os etwas wie ein Startmenü, aber recht spartanisch. Was mir überhaupt nicht gefällt: die Namen der Programme sind alle abgekürzt, was nicht der Übersicht dient. Da steht dann fünf mal LibreO…, und ich muss erst mit der Maus drüberfahren, um mir den vollen Namen anzeigen zu lassen, z.B. LibreOfficeDraw. Minuspunkte dafür.

Man kann die Programmicons aus den Anwendungen in die Favoriten-Leiste (so heißt die Leiste links) ziehen, aber nicht auf den Desktop, da haben Programme nach Ansicht der Linux-Entwickler nichts zu suchen. Dokumente dagegen kann man ganz leicht mit linke Maustaste/ Kopieren, auf dem Desktop linke Maustaste/Einfügen auf den Desktop befördern.

Eigentlich können wir jetzt loslegen. Drucker? einfach anschließen, einschalten und loslegen. Scanner? Oha, das ist nicht so einfach, dazu später mehr. USB-Stick? Einstecken, wird links unter der Favoritenleiste angezeigt, mit einem orangen Düpferl zum auswerfen.

Das meistbenutzte Programm auf privaten Rechnern ist sicherlich MS Word. LibreOffice Writer kann docx-Dokuente einwandfrei lesen und auch wieder speichern, und wer Word bedienen kann, wird auch mit Writer keine Schwierigkeiten haben. Man ruft es entweder mit einem Doppelklick auf ein Dokument auf, oder man klickt auf das Icon „LibreOffice“ in den Anwendungen, dann kommt der Libre-Office Startbildschirm mit einer Übersicht vormals geöffneter Dokumente..

Dann gibt es noch ein Icon, das sieht aus wie ein antiker DOS-Prompt, das ist das Terminal oder auch die Kommandozeile. Damit werden wir uns später noch befassen, aber keine Bange, ich erkläre es bei Bedarf dann ganz genau. Jetzt ist der richtige Zeitpunkt, sich ein wenig mit Writer, Calc (Tabellenkalkulation wie Excel) und evtl. auch Draw (Zeichenprogramm) zu befassen.  Diese Programme sind standardmässig vorinstalliert, man kann gleich loslegen.

Zum Beenden von Ubuntu klickt man rehts oben auf das Dateibaum-Symbol und wählt Ausschalten/Abmelden.

Insgesamt finde ich, dass Ubuntu einen sehr aufgeräumten Eindruck macht, mich erinnert es etwas an ältere MacOS. Das ist jetzt nicht besonders modern oder grafisch ausgefeilt, aber es ist funktional und man kann gleich loslegen. Wenn man nicht unbeding 20 Programme gleichzeitig bedienen will, ist es eine gute Wahl.

 

Auf zu neuen Ufern: Linux statt Microsoft Windows

Long time no see, liebe Gemeinde. Ich hab auch lange nichts Programmier- und Entwicklungstechnisches mehr gemacht, meine Homepage steht ja schon lange soweit, da hab ich mich mehr auf die Anwenderseite von WordPress verlegt und meine diversen Shops und Blogs gepflegt.

Jetzt wirds aber an der Zeit, was ganz Neues zu tun! Ich musste ja vor zwei Jahren in einen neuen Laptop investieren, weil der Alte kaputtgegangen war: Grafikkarte im Eimer, irreparabel.

Und jetzt kommt Microsoft und stellt im Herbst die Unterstützung für Windows 10 ein. Mein Laptop ist aber nicht Windows-11-tauglich, und ich will mir nicht schon wieder einen neuen Rechner kaufen.

Da linst man mal über den Tellerrand, und stellt fest dass Linux seit der letzten Begegnung vor 10, 15 Jahren sich ganz schön herausgewachsen hat. Es gibt ein wohlsortiertes Sortiment von Betriebssystemversionen für unterschiedliche Anforderungen, es gibt ganz fantastische Open Source/Public Domain Software, es gibt zu alllem und jedem Supportforen, es gibt Kompatibilität für alle MS Office Programme – ich brauch keinen neuen Rechner, ich brauch nur ein neues Betriebssystem.

Mein bester Freund hat mir einen wunderbaren mittelalten Laptop mit vorinstalliertem Linux Ubuntu drauf zur Verfügung gestellt, und ich teste seit ein paar Tagen dass die Schwarte knackt.

Ich teste verschiedene Linux-Versionen, und alle Alternativen zu Windows-10 Software, die ich kriegen kann. Es sieht gut aus: niemand muss sich mehr von MIcrosoft abhängig machen!

Es wird spannend, ich werde hier en Detail berichten. Freut euch auf viele spannende neue Beiträge!

Es geht voran mit dem Stichwortregister-Plugin: aus drei mach zwei

Ich hab mir heute nochmal die Erstellung von Admin-Menüs in WordPress zu Gemüte geführt, und beschlossen aus den drei Plugins zur Erstellung eines Stichwortregisters doch zwei zu machen.  Es sind ja auch getrennte Funktionalitäten, einmal wird die Stichwortliste als CSV aus der wp_posts erstellt, eine Ausgabeseite angelegt und in die wp_options eingetragen, und der Shortcode erzeugt, und zum zweiten wird die Negativliste gepflegt. Ausserdem bräuchte ich dann für die Negativliste eine Menütiefe von 3, und da wirds tricky, das kann WordPress nicht so ohne weiteres.

Man könnte die CSV-Datei, die Ausgabeseite und die Tabelle für die Negativliste auch bei Aktivierung des entsprechenden Plugins automatisch erzeugen, aber irgendwie ist es mir sympathischer, das manuell anzustossen. Muss man halt eine recht ausführliche Anleitung mitliefern, aber das krieg ich auch noch gebacken 😉

Jetzt erst mal weiter mit dem Plugin-Zusammenfassen. Läuft ganz gut, ich hab wohl recht sauber programmiert, Morgen mehr!

Update: Das war ja einfach. Ich habe ein schönes Tutorial bei Honar Systems für die Erstellung von WordPress Admin Pages mit Sub Pages gefunden, damit war die Hauptarbeit schon erledigt. Es gibt jetzt einen Menüeintrag „Stichwortregister“ mit zwei Untermenüs „Konfiguration“ und „CSV Datei“. Es gibt des weiteren einen eigenen Menüpunkt „Negativliste bearbeiten“. Hier mal nur ein kurzes Snippet für die Erzeugung der Menüs:

 function stichwortregister_admin_menu() {
add_menu_page(
__( 'Stichwortregister', 'de_DE' ),
__( 'Stichwortregister', 'de_DE' ),
'manage_options',
'stichwort-page',
'stichwortregister_admin_page_contents',
'dashicons-plugins-checked',
3
);
add_submenu_page( 'stichwort-page',
__( 'Stichwortregister', 'de_DE' ),
__( 'CSV-Datei', 'de_DE' ),
'manage_options',
'stichwort-page-sub-menu-csv',
'stichwortregister_sub_menu_admin_page_csv_contents');

add_submenu_page( 'stichwort-page',
__( 'Stichwortregister', 'de_DE' ),
__( 'Konfiguration', 'de_DE' ),
'manage_options',
'stichwort-page-sub-menu',
'stichwortregister_sub_menu_admin_page_contents');


}
add_action( 'admin_menu', 'stichwortregister_admin_menu' );

Die Funktionalitäten haben sich nicht geändert, ich hab sie nur ein bisschen anders einsortiert. Lief problemlos, ich hab da echt sauber gearbeitet. So, jetzt muss es aber gut sein. Zwei Plugins für ein Stichwortregister, damit leben wir einfach 😉

Perfektionisten würden jetzt noch die Stichwortliste in eine MySQL Tabelle packen, aber mir gefällt das mit dem CSV eigentlich ganz gut, vielleicht will man die Liste auch mal extern bearbeiten oder ergänzen. Ich lass es jetzt mal so.

Nachtrag: die Negativliste im praktischen Einsatz

Ich war noch die praktische Anwendung der Negativliste für das Stichwortverzeichnis schuldig, die liefere ich jetzt nach. Wir haben ja unsere Negativ-Wörter in der Tabelle negativliste stehen und können sie per Plugin pflegen.

Jetzt kommt ihr Einsatz: ich mach das an der Stelle, wo die Stichwortliste aus der CSV-Datei eingelesen und in ein Array weggeschrieben wird. Also, wir gehen in die Function csv_einlesen(). Und zwar an die Stelle, wo die CSV mit einer While not EOF-Schleife eingelesen wird. In jeder eingelesenen Zeile wird der Flag für die Negativliste erstmal auf 0 gesetzt. Dann geht man mit einem Select in die Tabelle negativliste und prüft, ob das aktuelle Wort enthalten ist, wenn ja wird der Flag auf 1 gesetzt. Dann geht man hin und schreibt das aktuelle Wort nur in das Array, wenn der Flag == 0 ist. Das wars!

$negativ_flag = 0;

//Solange nicht EOF erreicht, 1000 ist die maximale Zeilenlänge
while (($csv_array = fgetcsv ($handle, 1000)) !== FALSE ) {

foreach ($csv_array as $index) {

$negativ_flag = 0;
//mit Negativliste abgleichen
$db_item = $wpdb->get_results(
"SELECT * FROM negativliste WHERE wort LIKE '$index'");

if (count($db_item) > 0){
$negativ_flag=1;
}

//Nur ausgeben wenn das Wort nicht in der Negativliste enthalten ist
if ($negativ_flag == 0){
//Hier kommt der Knackpunkt: Neues Stichwort in Array schreiben
//***********************************
array_push($aktListe, $index);
//***********************************

} //Ende von if negativ_flag == false
}
}

Ich muss sagen, ich bin mit der Funktionalität sehr zufrieden, so kriegt man mit relativ wenig Aufwand doch recht saubere Stichwörter und kann die kleinen Füllwörtchen prima ausblenden. Mein Progrämmchen ist lernfähig, das grenzt schon ein bisschen an KI 🙂

Stichwortregister revisited: aus drei mach eins

Jetzt hab ich drei Plugins, um ein Stichwortregister zu erzeugen, das ist irgendwie nicht so zufriedenstellend, das könnte man sicher auch zusammenfassen.  Ich mach mal ein Brainstorming und schau was dabei rauskommt.

  • Bei Aktivierung des Plugins sollen ein paar Aufgaben erledigt werden: die Tabelle negativliste mit einigen (wenigen) Beispieldaten soll angelegt werden, einige Setup-Informationen sollen in die wp_options geschrieben werden. Das geht wahrscheinlich mit dem
    register_activation_hook( __FILE__, array( $this, 'example_activate' ) );
    
  • die Erstellung der CSV-Datei mit den Stichworten (aus dem Feld post_title erzeugt) soll manuell angestossen werden, damit man hier bessere Kontrolle hat.
  • Der Abgleich mit der Negativliste soll live bei Erstellung des Stichwortregisters erfolgen.
  • Fleißaufgabe: statt der CSV-Datei könnte man auch eine Custom Tabelle hernehmen, aber dabei ist mir der Webserver zu oft abgeraucht, da hab ich keine Lust drauf.

Das wird natürlich ein ewig langer Rattenschwanz, wenn man das alles in ein einziges Plugin packt, da müsste ich gucken ob man den Ablauf nicht besser straffen und verschlanken kann. Mal schauen ob mich die Arbeitswut noch packt… ich zweifle, die Rohfassung läuft ja ganz hübsch, das langt mir immer 😉

Update am Folgetag: Ich versuch mal meinen inneren Schweinehund zu überwinden und die drei Plugins doch zu einem Paket zusammenzufassen. Ich hab mir dazu mal eine lokale Kopie meines Praxis Dr. Inselfisch Blogs angelegt, auf der ich auf einer „leeren Wiesn“ entwickeln kann. Mal sehen wie weit ich komme.

Update drei Tage später: ich prokrastiniere. Mir ist das einfach zu fad, bereits funktionierende Code Snippets nochmal komplett neu zusammen zu fassen. Na, ich muss mal schauen. wahrscheinlich geh ich eh nochmal drüber, wenn ich das Stichwortverzeichnis auf einem Life-Blog einsetzen möchte. Erster Kandidat ist dieser hier 😉

Der Tabelleneditor für die Negativliste: die Screenshots

Die Negativliste bearbeiten geht nur auf der Admin-Seite, das hab ich mal so festgelegt. Ich habe einen neuen Admin Menüpunkt “ Negativliste bearbeiten“ angelegt, wenn man den aufruft sieht die Startseite so aus:

Negativliste-bearbeiten

Die bereits vorhandenen Worte werden tabellarisch angezeigt, Man kann sie Löschen, dann öffnet sich das Unterformular und man muss nochmal auf den Button „Löschen“ klicken:

Wort-loeschen

Erst dann wird der Delete aktiv:

 Wort-loeschen-OK

 

…oder man kann einen neuen Eintrag anlegen.

Wort-eintragen

Ein kleines, aber rundes Feature, finden sie nicht auch? 🙂

Was mich allerdings beim Entwickeln ein bisschen ausgebremst hat: die Routinen für den Insert und Create und Delete haben mir ein paar Mal den Webserver abgeschossen bis sie fehlerfrei durchgelaufen sind, da half nur ein kompletter Neustart von Apache, MySQL und Xampp. Das darf natürlich in einer „richtigen“ WordPress-Umgebung nicht passieren, da muss man noch Fehlerbehandlungsroutinen einbauen. ich hab da jetzt aber keine Lust mehr dazu.

So, was fehlt noch? Ach ja, die Negativliste wartet noch auf ihren Einsatz beim Aufbau des Stichwortregisters. Das überleg ich mir morgen, wo man da am Geschicktesten einhakt.

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.

Stichwortverzeichnis: die Negativ-Liste

Was soll die können? Nun, ganz einfach. Man soll da Wörter eintragen können, die in dieser Schreibweise nicht im Stichwortregister auftauchen sollen.

Hintergrund: die Stichwortliste wird ja programmgesteuert erzeugt und nimmt prinzipiell alle Wörter auf, die großgeschrieben sind. Die werden dann noch von etlichen Sonderzeichen bereinigt, aber es kann natürlich nicht geprüft werden, ob es sich wirklich um Substantive handelt oder ob nur ein Wort am Satzanfang großgeschrieben wurde.  Da rutschen dann schon mal Wörter durch wie Es, Da, Was, Das, So… klar was ich meine? Sind halt keine sinnvollen Stichwörter. Ich hab in der Access-Version mal versuchsweise alle Wörter ausgeblendet, die weniger als 3 Buchstaben haben, aber so ganz das Gelbe vom Ei ist das auch nicht. Auf dem Programmierblog hier würde dann z.B. alle rausfallen was SQL oder PHP oder AI  heißt – nicht gut!

Woher soll mein Plugin aber wissen, welche Wörter es ausblenden soll? Eben! Hier kommt die Negativliste ins Spiel. Ich versuche es mal mit einer Tabelle, obwohl ein CSV sicher auch sinnvoll wäre, das könnte man auch extern bearbeiten. Wie auch immer, es muss ein Admin-Menüpunkt her „Negativliste bearbeiten“. Und die Liste muss an geeigneter Stelle überprüft werden, das mach ich am besten an der Stelle, wo das CSV mit den Stichwörtern in ein Array eingelesen wird. Wenn ein Wort in der Negativliste gefunden wird, soll es nicht ins Array aufgenommen werden. Sollte so oder ähnlich funken, ich fang mal an und berichte später.

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.