So wird Word­press «gehackt»

In Word­press sind in­divi­duel­le Meta­da­ten (custom fields) eine mächtige Waffe, wenn es darum geht, Zu­satz­in­for­matio­nen anzu­zei­gen und eine Web­site mit krea­tiven Fea­tures aus­zu­statten.

Was tun mit einer Access-Datenbank, wenn man die dort gespeicherten Informationen nicht nur an seinem Windows-PC, sondern auch am Smartphone und überall zur Verfügung haben möchte? In meinem Projekt 2020 habe ich einige Ideen durchexerziert und bin schliesslich bei Word­press gelandet.

In meinem Fall geht es um die Datenbank mit meinen Artikeln, die ich seit ungefähr 1992 führe. Ich habe sie in eine Word­press-Installation überführt, in der meine gesammelten Artikel stecken und die via archiv.matthiasschuessler.ch abrufbar ist. Hier beschreibe ich, wie ich die Datenübernahme von Access nach Word­press durchgeführt habe und hier geht es darum, wie man die Suche verbessert, sodass ich bei der Abfrage meine Artikel nach Medium und zeitlich eingrenzen kann.

So weit, so gut. Eine Sache war bis jetzt jedoch unbefriedigend.

Was tun mit den zusätzlichen Datenbankfeldern?

In meiner Datenbank waren einige Zusatzinformationen enthalten:

  • Aus der Zeit, als ich noch als rasender Lokalreporter unterwegs war, stammt das Datenfeld Ort, in dem ich eingetragen habe, von wo aus ich berichtet habe.
  • Im Feld Thema habe ich ursprünglich ein Oberthema eingetragen; später habe ich das für die Rubrik (wie Kummerbox, Tipp der Woche, Patentrezept) zweckentfremdet.
  • Im Feld Ausgabe steht bei den Magazinen wie «Publisher», in welcher Nummer ein Beitrag erschienen ist. Das ist bei nicht so häufig erscheinenden Titeln sinnvoller als das Datum der Veröffentlichung.
  • Das Feld Subthemen rührt daher, dass ich oft Beiträge gemacht habe, die aus mehreren Teilen bestanden. Für den «Publisher» habe ich die Publishing- und Download-Tipps verfasst, die aus ungefähr einem Dutzend Einzelbeiträgen bestanden. Die Kummerbox im «Tagesanzeiger» umfasste normalerweise zwei bis vier Leserfragen.
  • Das Feld Honorar dürfte selbsterklärend sein.

Aus mir heute nicht mehr einleuchtenden Gründen habe ich seinerzeit auch die Zahl der Bilder und die Längen von Text und Bild eingetragen¹.

Damit diese Informationen auch in Word­press erhalten bleiben, habe ich sie als sogenannte Custom Fields übernommen. Die sind unabhängig von meinem Projekt eine spannende Sache, über die Bescheid zu wissen nicht verkehrt ist!

Mittels Custom Fields, eigenen Datenbankfeldern, stattet man seine Posts mit beliebigen Metadaten aus: Wer ein klassisches Weblog, also ein Internettagebuch schreibt, könnte ein Feld für die Stimmung einfügen. Das erlaubt es dann, jeden Blogpost mit einem passenden Ikönchen auszuzeichnen, also etwa eine Sonne, wenn der Tagebucheintrag mit guter Laune verfasst worden ist. Wenn man eine Website mit Filmkritiken verfasst, dann richtet man ein Custom Field für die Bewertung ein.

Um das Resultat der Bemühungen vorwegzunehmen: Nach einem kleinen Eingriff ins Theme erscheinen die Zusatzinformationen zu einem Eintrag in meiner Artikeldatenbank als Auflistung am Ende des Beitrags.

Bei mir stecken dort eben die Verwaltungs-Informationen. Nachdem es kein Problem war, beim Import die Custom Fields mitzunehmen, blieb eine offene Frage: Wie verwendet man die Custom Fields sinnvoll in Word­press?

Das Advanced Custom Fields-Plugin zeigt die Metadaten im Backend an

Im Backend (also dort, wo man seine Artikel erfasst und bearbeitet) hilft das Plug-in Advanced Custom Fields weiter: Es zeigt Datenbankfelder im Editor an und erlaubt es, sie zu editieren.

Die eigenen Felder erscheinen unterhalb des Editors und werden dort mit Informationen befüllt.

Es gibt einen Menüeintrag namens Eigene Felder, über den man Feldgruppen einrichtet. In einer Gruppe ist zu hinterlegen, welche Felder es gibt und was für Datentypen sie beinhalten. Mit diesem Plugin ist es ein Klacks, die Metadaten zu erfassen und zu verwalten.

Im Plugin Advanced Custom Fields wird in einer Feldgruppe festgelegt, welche Datenbankfelder zu einem Satz gehören.

Doch ins Frontend (also in die für die Besucher sichtbaren Seiten) bekommt man diese Daten nicht so leicht.

Das ist einleuchtend: Diese Metainformationen sollen in aller Regel nicht eins zu eins angezeigt, sondern ins Layout einbezogen werden.

Um bei den oben erwähnten Beispielen anzuknüpfen: Die Information zur Stimmung beim Internettagebuch wird sinnvollerweise als Icon bzw. Symbol dargestellt. Die Bewertung auf einer Film- oder Gadget-Website wiederum müsste mittels Sternchen oder über eine Art Fieberthermometer versinnbildlicht werden.

Es gibt daher keine vorgefertigten Themes, die die Metadaten automatisch berücksichtigen würden. Ich habe auch kein Plugin gefunden, mit dem man sie auf seine Site bekommen würde. Nach etwas Recherche war es klar, dass ich um einen Eingriff in mein Theme nicht würde herumkommen.

Wie man die Metadaten in das Frontend hineinbekommt

Der Beitrag Word­press Custom Fields 101: Tips, Tricks, and Hacks hat aber klargemacht, dass dieser «Hack» keine sonderlich grosse Sache ist. Im Idealfall braucht es nur eine einzige Zeile Code, die man hinzufügen muss.

Und man braucht noch nicht einmal einen HTML-Editor und ein FTP-Programm, weil Word­press die Möglichkeit bereithält, Theme-Dateien übers Backend zu bearbeiten. Die findet sich unter Design > Theme-Editor.

Die Datei, die man bearbeiten muss, ist jene, die für die Anzeige eines einzelnen Beitrags zuständig ist, also single.php. Man muss dort den famosen WordPress-Loop auffinden – dort wird der Inhalt des Blogposts ausgegeben. Man erkennt ihn daran, dass er im in der Datei single.php in einer While-Schleife steckt:

<?php while ( have_posts() ) : the_post(); ?>

Hier dazwischen ist der Code für die Ausgabe des Blogposts, den man entsprechend ergänzt. Am Ende wird die Schleife geschlossen:

<?php endwhile; // end of the loop. ?>

Eine Zeile Code erledigt den Job

Die Zeile Code, die man dazwischen hinzufügen muss, um eine einzelne Metadaten-Angabe auszugeben, lautet im Beispiel wie folgt:

<p>Today’s Mood: <?php echo get_post_meta($post->ID, 'Mood', true); ?></p>

In Fall meines Themes musste ich natürlich meine eigenen Variablen einfügen, und ausserdem aufs HTML-Escaping achten: Bei meinem Theme steht der ganze Loop in einem einzigen PHP-Tag (<?php ... ?>). Wenn man hier eine HTML-Ausgabe einfügen will, muss man ihn erst schliessen (?>) und nach der Ausgabe der Metadaten wieder öffnen (<?php), sonst gibt es eine Fehlermeldung.

Das berücksichtigt, war es jetzt keine Hexerei, den Code für meine Metadaten zu ergänzen:

?>
<p><strong>Metadaten des Artikels</strong><br>
<i>Thema: </i><?php echo get_post_meta($post->ID, '_Thema', true); ?><br>
<i>Nr: </i><?php echo get_post_meta($post->ID, '_NR', true); ?><br>

Um die Felder für die Nutzer der Website sichtbar zu machen, muss das Theme um einige Codezeilen ergänzt werden.

Und so weiter, bis alle Daten ausgegeben sind. Eine Spezialität habe ich mir für die Zeile mit dem Honorar ausgedacht. Sie soll nur angezeigt werden, wenn der Besucher eingeloggt ist – was nur auf mich zutrifft, sodass diese Angabe allen anderen vorenthalten wird. Das geschieht über folgende Zeile:

<?php if( is_user_logged_in() ) { ?><i>Honorar: </i><?php echo get_post_meta($post->ID, '_Honorar', true); ?><br><?php }?>

Und wo ich doch dabei war, an dieser Datei herumzufuhrwerken, habe ich zudem die Kommentarfunktion auskommentiert. Ich halte es nämlich nicht für notwendig, dass Artikel an dieser Stelle öffentlich kommentiert werden können.

Einfacher als gedacht!

Fazit: Das war einfacher als gedacht. Es könnte sein, dass ich auf den Geschmack gekommen bin und ihr damit rechnen müsst, dass ich dieses neue Wissen in meinen Blogs vermehrt anwenden werde. Ideen habe ich schon – aber die werden nicht verraten!

Jedenfalls sind diese Custom Fields etwas, das mir an Word­press ausgezeichnet gefällt. Wenn man einmal kapiert hat, wie sie funktionieren, sind sie einfach anzuwenden, und sie eröffnen eine riesige Möglichkeit, seiner Website einen individuellen Anstrich zu verleihen.

Ein abschliessender Tipp: Ich empfehle, die Änderungen genau zu dokumentieren, denn es ist damit zu rechnen, dass sie bei einem Theme-Update verloren gehen und neu hinzugefügt werden müssen.

Nachtrag

Wie zu Recht bemerkt wird, sollte man diese Änderungen nicht direkt am Theme vornehmen, sondern ein «Child» anfertigen. Diesen Punkt erläutere ich im Beitrag Das perfektionistische Ende eines überambitionierten Projekts.

Fussnoten

1) Anhand der seltsamen Masseinheit, die ich dort eingetragen habe, konnte ich rekonstruieren, dass das die jeweilige Länge angibt (in Millimetern pro Spaltenlänge). Das sollte mir ermöglichen, in der Datenbank nach längeren oder kürzeren bzw. bildlastigen Artikeln zu suchen. An sich eine praktische Idee, allerdings zu aufwändig beim Erfassen.

Beitragsbild: Ob sie Word­press nutzt oder hackt, lässt sich anhand des Bildes nicht eindeutig festlegen (WebFactory Ltd, Unsplash-Lizenz).

4 Kommentare zu «So wird Word­press «gehackt»»

  1. Idealerweise machst du alle Manipulationen am Theme in einem Child-Theme, quasi einer Variante des Original-Themes. Bei einem Update wird das Original aktualisiert und die Neuerungen fliessen von da in dein Child-Theme. Das mindert die Gefahr, dass dir irgendwas überschrieben wird.

    Custom Fields sind im Übrigen nur der Einstieg in ein ganz neues Universum: dazu gibt es Custom Taxonomien, Custom Post Types, Relationen, Listings und Calculations. Mit dynamischen Daten in WP kannst du ganze Wiki-Strukturen aufbauen, Layouts steuern und dynamische Anwendungen bauen. Crocobloc bietet dazu z.B. diverse Tools an.

  2. Die Kommentare kannst Du übrigens in den Einstellungen generell deaktivieren. Das gilt dann aber nur für neue Seiten.

    Beim wichtigeren Punkt war Roman schneller: niemals an einem Theme Anpassungen von Hand vornehmen! Updates ersetzen immer das gesamte Theme und überschreiben die Änderungen. Nach jedem Update die Anpassungen wieder nachzuführen ist aufwendig und hält einen mit der Zeit von Updates ab, welche für die Sicherheit aber wichtig sind. Child Themes sind eine elegante Lösung.

  3. Ihr habt mit den Kinder-Themen natürlich recht. Ich bin dem Thema während meinen Recherchen begegnet und habe vor, es vertieft anzusehen. Aber jetzt ging es mir erst einmal um schnelle Resultate. 😉

    Aber gut, dass ihr den Hinweis ergänzt habt; die Updates sollte man nicht ausser Acht lassen. In meinem Fall ist es keine Sache, einen Codeblock zu ergänzen, aber wenn man elaboriertere Änderungen vornimmt, sieht es anders aus.

  4. Im Plugin Shortcodes Ultimate gibt es drei Shortcodes u.a. [su_meta key=“mein_feldname“ post_id=“1234″] die sehr einfach Daten aus der Datenbank einfügen können.

Kommentar verfassen