Von der Idee zum WordPress-Plug-in: Schlagwörter automatisch hinzufügen #1

Alexander Trust, den 24. Januar 2021
Wordpress - Wallpaper
Wordpress – Wallpaper

Wer immer schon mal wissen wollte, wie man ein eigenes WordPress-Plug-in anfertigt, für den ist der nachfolgende Beitrag mit Sicherheit interessant. Denn bei uns war die Idee, Schlagwörter automatisch hinzuzufügen, damit wir bei der Überarbeitung der Artikel am Ende noch weniger Arbeit damit haben. Was aber als Bastelei am eigenen WordPress-Theme anfing und nur ein paar Zeilen Quellcode im Footer ausmachte, endete schließlich als ausgewachsenes Plug-in.

Warum? Es wäre zu einfach, zu sagen, weil wir es können. Es gibt viel einleuchtendere Gründe:

  • Weil diese Aufgabe so oft ausgeführt wird, dass sich der Aufwand lohnt.
  • Da wir nicht ständig den Quellcode anpassen wollten, um wieder eine Option hinzuzufügen, sondern dies unmittelbar erledigen zu können.
  • Weil es durchaus Spaß macht, je öfter man sich einer Herausforderung stellt und man am Ende sogar noch etwas lernt.
  • Da ein Plug-in am Ende wartungsfreundlicher ist, und auch unabhängig von einem Thema genutzt werden kann.
  • Weil das Plug-in vielleicht sogar so interessant ist, dass man es anderen Leuten zur Verfügung stellen kann, die das gleiche Problem lösen wollen.

Automatisierung tut not

Regelmäßige Macnotes-Leser wissen, dass wir im Hintergrund versuchen, trotz WordPress eine Datenbasis aufzubauen, mit der wir irgendwann dann den nächsten Schritt wagen können. Bis dahin wird es aber noch eine Weile dauern. Anfang Januar erwähnte ich im Wasserstand #19, dass wir bei der Überarbeitung das Jahr 2009 abgeschlossen haben. Mittlerweile bin ich sogar schon beim Februar 2010 angelangt.

Doch diese Überarbeitung ist so langwierig, und vor allem so repetitiv. Immer, wenn Aufgaben sich wiederholen, lohnt es sich, nach einer Automatisierung derselben zu suchen.

Die Idee: Schlagwörter automatisch hinzufügen

Wenn ich schreibe Schlagwörter, dann meine ich eigentlich sogar einen eigenen Typus, der bei uns intern „Keywords“ genannt wird. Wir haben zusätzlich zu den öffentlichen Schlagwörtern, für die es auch Archive gibt, nämlich interner Schlüsselwörter im Einsatz, die nicht für Nutzer und Suchmaschinen einsehbar sind, die uns aber erlauben, semantische Filter an manchen Stellen auf der Webseite einzusetzen, beispielsweise wenn es darum geht, „ähnliche Artikel“ anzuzeigen.

Nun ist die Situation, die ich bei Macnotes vorfand aber unbefriedigend. Denn es gab und gibt auch immer noch mehr als zehntausend öffentlich sichtbare Schlagwörter. Ich gehe bei der Überarbeitung chronologisch vor, Artikel für Artikel, da wir über die Jahre mehr als ein halbes Dutzend Webseiten (Macnotes, iPhone-Notes, Apfelmagazin, Blog4i, u. a. m.) zusammengeführt haben. Es gab inhaltlich doppelte Beiträge, die müssen zusammengeführt werden, und neu verlinkt. Ich könnte auch mit der Dampfhammer-Methode alle Beiträge und deren Schlagworte automatisch anpassen oder löschen. Nur dann fehlten mir auf einen Schlag zehntausende Endpunkt für Google. Stattdessen arbeite ich diese Stück für Stück ab und füge dann auch Weiterleitungen hinzu, damit die Suchmaschine nicht ganz im Dunkeln tappt.

Wie kann man die Idee umsetzen?

Wenn ich in den vielen Jahren Computerei etwas gelernt habe, dann, dass es nicht schadet, sich die eigene Idee einmal vor Augen zu führen.

Gerade Laien bekommen so ein besseres Gefühl dafür, was alles zu tun ist. In der Informatikausbildung nennt man solchen Output gerne auch mal Pseudocode. Strukturierte Notizen reichen aber vollkommen aus, um dann die einzelnen Teile auszuarbeiten.

Wenn ich also Schlagworte automatisch ersetzen will, dann muss ich mir Gedanken machen, darüber …

  • … wann das geschehen soll,
  • … welche Schlagwörter das sein sollen,
  • … womit ich sie vergleichen kann, um zu entscheiden, ob sie automatisch hinzugefügt werden.

Ich könnte mir noch mehr Fragen stellen. Aber ungefähr so beginnt dann ein Brainstorming und kann man versuchen, Antworten zu finden.

1. Schritt: direkt im Artikel

Meine erste Idee war, ich könnte, „wenn ich als Administrator eingeloggt bin“, und nur dann, eine Funktion aufrufen, die dann die Schlagwörter hinzufügt.

Ich gehe dann gerne hin, und füge in der Datei footer.php ersten Quellcode hinzu und erzeuge eine Ausgabe. Natürlich mache ich das nicht live auf Macnotes, sondern in meiner Entwicklungsumgebung am heimischen Computer. Ich setze für die WordPress-Entwicklung gerne MAMP ein. Das hat sich bewährt und ist relativ pflegeleicht (funktioniert auch unter macOS Big Sur und auf Apple Silicon).

Da ich gerade einen Artikel überarbeitete, stoppte ich die Arbeit daran und dachte. Dieser kann als Startpunkt für die Funktion dienen. Also suchte ich nach einem Merkmal, das relativ eindeutig zuordenbar ist. Im Titel sehr vieler „Notizen“-Beiträge auf Macnotes kommt die Phrase „Notizen vom“ vor. Wenn ich 1000 Mal in Zukunft so ein Schlagwort automatisch hinzufüge, und vielleicht zwei, dreimal daneben liege, dann ist es einfacher, dreimal das Schlagwort wieder zu entfernen.

Überschrift mit Phrase vergleichen, Ergebnis als Arbeitsauftrag

Also verglich ich im Quellcode den Inhalt vom Titel mit der Phrase „Notizen vom“ und gab dann etwas aus. Die Notiz würde in etwa lauten:

Wenn der Titel "Notizen vom" enthält, dann füge das Keyword "Notizen (MN)" hinzu, aber nur, wenn es noch nicht vorhanden ist.

Ja und dann kann man sich bereits an die Arbeit machen. Wer noch Laie ist, der kann anhand dieser Anweisung auch Google oder eine andere Suchmaschine bemühen, beispielsweise danach, wie man an den „Titel“ eines Beitrags in WordPress gelangt, oder wie man in PHP innerhalb einer Zeichenkette (String) nach einer Phrase (Substring) sucht. So kommt man dann von A nach B und hangelt sich immer weiter.

Wer schon mehr Erfahrung hat, wird Anlaufstellen kennen, oder eben direkt losprogrammieren. Der erste Code sieht dann in etwa wie folgt aus:

if(strpos($post->post_title, 'Notizen vom') !== false) {
 echo 'An dieser Stelle muss dann die Funktion arbeiten.';
}

Die PHP-Funktion strpos wird gerne verwendet, um eine Gelingensbedingung zu erzeugen. Sie liefert entweder eine Zahl zurück, oder false, wenn die gesuchte Zeichenkette nicht vorhanden ist. Das ist prima, denn uns interessiert nur, ob es vorkommt. Also müssen wir umgekehrt fragen, ob beim Vergleich mit dem Titel „nicht false“ zurückgegeben wird.

Überprüfen, ob das Schlagwort vorhanden ist

Nun müssen wir noch überprüfen, ob der Beitrag nicht eventuell schon das Keyword „Notizen (MN)“ nutzt. WordPress bietet dazu bereits eine Funktion an namens has_term() (vgl. WordPress Code-Referenz).

Wir fügen also dem Code von oben noch etwas hinzu:

if(strpos($post->post_title, 'Notizen vom') !== false) {
	if(has_term('Notizen (MN)') {
	echo 'es gibt das Keyword schon.';
} else {
	echo 'jetzt müssen wir das Schlagwort hinzufügen.';
}
}

Schlagwort hinzufügen

Wir müssen uns nun also Gedanken machen, wie wir das Schlagwort an der Stelle hinzufügen. Auch dafür bietet WordPress eine Methode an: wp_set_post_terms() (vgl. WordPress Code-Referenz).

Abermals passen wir dann den Code von oben weiter an.

if(strpos($post->post_title, 'Notizen vom') !== false) {
	if(has_term('Notizen (MN)') {
	echo 'es gibt das Keyword schon.';
} else {
	wp_set_post_terms($post->ID, 'Notizen (MN)', 'keywords', true);
	echo 'wir haben das Schlagwort hinzugefügt.';
}
}

2. Schritt: Abstrahieren nicht vergessen

Jetzt haben wir doch alles erreicht, was wir wollten, und können uns wieder anderen Dingen zuwenden?

Nicht ganz. Denn wir wollen ja zum Beispiel auch zwei oder mehr Schlagworte anpassen. Zunächst bedeutet das, dass wir den Code von oben weiter umbauen müssen. Doch zunächst sollten wir uns wieder ein paar Gedanken darüber machen, wie man das machen kann.

Der unmittelbarste Zugang wäre vermutlich, denn Quellcode einfach zu kopieren, und einfach nur die Vergleichsphrase im Titel zu finden und dazu das passende Schlagwort. Aber man kann das auch eleganter lösen:

Übergebe ein Array mit allen möglichen Schlagworten. Vergleiche und ersetze für alle diese.

Also dann ans Werk. Aus einem Schlagwort hab ich kurzerhand erst einmal zwei gemacht, und diese zu einem Array ($tags[]) hinzugefügt. Dann muss ich natürlich noch eine Funktion suchen, die mir erlaubt, für jedes Element im Array etwas auszuführen. Da hält PHP dann die foreach-Schleife bereit.

$tags = [
	"Notizen vom" => "Notizen (MN)",
	"Windows 7" => "Windows 7"
  ];
  foreach ($tags as $title => $keyword) {
    if(strpos($post->post_title, $title) !== false){
      if ( has_term($keyword, 'keywords') ) {
        echo ( '<p>Es gibt das Keyword "'.$keyword.'" schon.</p>' );
      } else {
        wp_set_post_terms( $post->ID, $keyword, 'keywords', true );
        echo ( '<p>Wir haben das Keyword "'.$keyword.'" hinzugefügt.');
      }
    }
  }

3. Schritt: Noch weiter abstrahieren, Plug-in entsteht

Das letzte Stück Quellcode war doch eigentlich ganz prima? Ja, ich hätte einfach in der Footer-Datei bei neuen Schlagworten, die mir einfallen, diese ergänzen können, die Datei auf den Server hochladen, und weiterarbeiten können.

Aber auch das ist nur ein fauler Kompromiss. Denn viel besser wäre es ja, wenn man direkt in WordPress beliebig viele Schlagworte hinzufügen könnte, die man auf diese Weise ergänzen wollte.

Vorüberlegungen

An dieser Stelle lohnt es abermals, ein paar Vorüberlegungen zu machen. Fragen, die man sich stellen kann, lauten:

  • Wie kann ich die Daten getrennt vom Code bearbeiten?
  • Welche Möglichkeiten habe ich, um mit Daten zu interagieren?

Auch das sind nur zwei von vielen Fragen, mit denen man sich an der Stelle beschäftigen könnte. Mir ist zum Beispiel in den Sinn gekommen, eine Text-Datei oder eine CSV-Datei zu nutzen, um darüber die Daten zu ergänzen. Aber dann hätte ich auch das Problem, diese immer wieder zu ergänzen, und hochladen zu müssen.

Als Nächstes fällt einem dann eine Tabelle ein. WordPress nutzt MySQL und bietet sogar Funktionen, um sowohl Tabellen zu erstellen, als auch Daten darin zu ändern.

Nur dann benötige ich ja irgendeine Möglichkeit, die Daten online hinzuzufügen. Ich könnte natürlich eine separate HTML/PHP-Seite erstellen, die ich aufrufe, und der ich es erlaube, mit der Datenbank zu kommunizieren. An dieser Stelle reifte dann der Gedanke, dass ich auch gleich ein Plug-in für WordPress entwickeln könnte. Das hat nämlich auch den Vorteil, dass ich die Funktionalität nicht verliere, sollte ich mal das Theme für Macnotes anpassen.

WordPress-Plug-ins erstellen, aber wie?

Ich hatte vor Jahren schon mal ein Plug-in für WordPress erstellt. Aber wie das eben so ist, wenn man sich nicht so sehr mit der Materie auseinandersetzt, dann muss man sich erst wieder einarbeiten. Eine Anlaufstelle ist natürlich WordPress’ eigenes Handbuch für die Plug-in-Entwicklung. Das ist aber so strukturiert, dass man viel hin- und hernavigiert und mit sehr vielen komplexen Dingen konfrontiert wird.

Einfacher geht es, wenn man in der Suchmaschine seines Vertrauens nach Alternativen Ausschau hält. Das können auch teilweise sehr alte Beiträge von Smashing Magazine (9+ Jahre) oder von Frank Bültge (14+ Jahre) sein. Selbst wenn manche der Hinweise darin heute nicht mehr aktuell sein „sollten“, dann bekommt man nämlich Anhaltspunkte, wie die Dinge zusammenpassen und kann sich von dort aus weiterhangeln.

Was braucht man für ein WordPress-Plug-in?

Das einfachste WordPress-Plug-in, das man herstellen kann, besteht aus einer einzelnen Datei, die man einfach in das Plug-in-Verzeichnis von WordPress kopiert (besser aber in einen Unterordner). „So einfach“ ist das tatsächlich.

Diese Plug-in-Datei enthält im Kopf ein paar Kommentare, die WordPress dann ausliest und in der Administrationsoberfläche anzeigt.

/**
* Plugin Name: SN Add Keywords
* Plugin URI: https://sajonara.info
* Description: This plugin automatically adds keywords to the database, if they are found in the headline and not already implemented.
* Version: 0.0.2
* Author: Alexander Trust
* Author URI: https://sajonara.info
* License: GPL2
*/

Eine PHP-Datei, die nur diese Information enthält und sonst nichts, ist auf dem Papier auch schon ein „nutzloses“ Plug-in. WordPress zeigt es dann an, und man kann es aktivieren.

Plug-ins wollen aufgerufen werden

Angenommen, wir hätten den bereits fertigen Quellcode von davor in unsere Plug-in-Datei kopiert, hätte auch dieser funktioniert, WordPress beim Aktivieren allerdings eine Fehlermeldung ausgegeben. Das liegt nicht zuletzt daran, dass WordPress gerne möchte, dass Plug-ins und deren Funktionen „aufgerufen“ werden sollen.

Dazu stellt WordPress zwei Kategorien an Aufrufen zur Verfügung:

  • Hooks
  • Filter

Die Filter sollen vor allem dazu genutzt werden, um Inhalte zu verändern. Entsprechend gibt es für Filter (add_filter()) Parameter, die beispielsweise den Titel (the_title) oder den Text (the_content) betreffen. Es gibt noch viele weitere Endpunkte, an denen man einen Filter ausführen könnte.

Doch wir wollen ja nicht den Text verändern, sondern Schlagworte hinzufügen, und also sind die „Hooks“ (add_hook()) vielleicht eher für unsere Zwecke geeignet.

Was wir dann also machen können, um WordPress zufriedenzustellen, ist unseren Code von davor in eine Funktion integrieren, und diese mittels eines Action-Hooks aufzurufen.

add_action('wp_footer', 'sn_add_keywords');

function sn_add_keywords() {
 /* Unser Quellcode von zuvor. */
}

Drei Zustände eines Plug-ins

WordPress erkennt insgesamt drei Zustände eines Plug-ins, und kann, beim Eintreten derselben aktiv werden.

  • Beim Aktivieren,
  • beim Deaktivieren
  • und beim Deinstallieren.

Warum erzähle ich Euch das? Nun, weil es durchaus hilfreich sein kann, nicht nur an sich selbst zu denken, sondern auch an andere. Und an dieser Stelle erreicht dann die ursprüngliche Idee bereits eine interessante Komplexität.

Ich sagte ja, es wäre prima, wenn man eine Tabelle hätte, in die man dann die Schlagwörter hinzufügen kann. Das Aktivieren des Plug-ins eignet sich in diesem Fall dazu, die Tabelle anzulegen. Auch dafür hält WordPress dann Befehle bereit.

Ich finde aber, dass dieser Beitrag schon lang genug geworden ist, und habe mich deshalb dazu entschieden, noch einen zweiten Teil herauszubringen, in dem ich dann erkläre, wie man die Tabelle anlegt, sie mit ersten Daten füllt, und wieso es hilfreich sein kann, die Versionsnummer des eigenen Plug-ins ebenfalls in der Datenbank von WordPress zu speichern. Außerdem widme ich mich dann auch den anderen beiden Zuständen von Plug-ins. Nicht zuletzt wollt Ihr ja sicherstellen, dass Euer Plug-in, wenn man es deinstalliert, die Daten ordentlich löscht. Und über das Erstellen einer „Webseite“ für das Plug-in in der Administrationsoberfläche von WordPress haben wir auch noch nicht gesprochen.

Freut Euch also dann auf den zweiten Teil, der vermutlich nicht ewig auf sich warten lassen wird.

Weitere Teile der Reihe Von der Idee zum Wordpress-Plug-in


Ähnliche Nachrichten

Zugehörige Produkte