WordPress Block Bedingungen mit Block Logic

von

am

|

geschätzte Lesezeit:

6 Minuten

Disclaimer: Dieser Beitrag ist älter als zwei Jahre. Es könnte also sein, dass auch sein Inhalt in Teilen bereits veraltet ist.

Block Logic: WordPress Block Bedingung hinzufügen
Die Blöcke fallen, wie die Bedingung es vorgibt

Nach einigen Monaten der projektbedingten Pause, die mal so gar nichts mit WordPress und Internet zu hatte, meldet sich dieses Blog mit einer Spezialität zurück. Wie kann ich bei einem Block Theme dafür sorgen, dass WordPress einzelne Blöcke nur unter bestimmten Bedingungen ausgibt?

Diese Frage stellt sich mir, seit ich mit Block Themes und dem Full Site Editing experimentiere. Weiter in den Vordergrund ist sie nun gerückt, da seit WordPress 6.1 das Arbeiten mit Block Themes immer interessanter wird. Ich arbeite also am Redesign dieser Website mit einem Block Theme. Doch dafür brauche ich eine Lösung für die Ausgabe einzelner Blöcke unter bestimmten Bedingungen. Die liefert WordPress aber (noch?) nicht. Also musste ein Plugin her. Mit Block Logic habe ich dafür die passende Hilfe gefunden.

Was bedeutet WordPress Block Bedingungen?

Was meine ich damit, wenn ich von Bedingungen spreche, unter denen WordPress einen Block ausgeben soll?

Es geht um die sogenannten Conditional Tags, mit denen WordPress arbeitet. Der Codex nennt einige Beispiele, wie eine solche Bedingung aussehen kann. Ein besonders hübsches Beispiel ist das mit den Nachos:

if ( is_archive() && ! is_category( 'nachos' ) ) {
  
	// If it's an archive page for any category EXCEPT nachos, do something special

}

Diese Bedingung sorgt dafür, dass jede Kategorie-Seite – nur nicht das Archiv der Nachos – etwas Spezielles tun soll. Was das Spezielle ist, besagt diese Anweisung nicht. Sie stellt nur die Bedingung. Es könnte also sein, dass alle Kategorie-Archive die Meta-Angaben der Beiträge ausgeben sollen – nur das Nachos-Archiv soll darauf verzichten.

Die Liste dieser Bedingungen ist schon ziemlich lang. Durch eigene Funktionen kann sie aber auch noch länger werden.

Ein konkreter Anwendungsfall ist auf dieser Website, dass ich für meine Blogbeiträge die geschätzte Lesezeit ausgebe, diese aber nicht für zum Beispiel meine Kurs-Beschreibungen anzeigen will.

Im Rahmen meines herkömmlichen Themes hatte ich mich für die bedingte Anweisung entschieden. Ich habe also im Template der Beiträge (in der single.php) hinterlegt, dass die Lesezeit nur für Beiträge ausgegeben werden soll, die mit 'blog' kategorisiert sind.

Alternativ hätte ich für den Custom Post Type Kurse ein eigenes Template schreiben können.

Bedingte Anweisungen im Block Theme

Bei einem Block Theme gestaltet sich das Arbeiten mit bedingten Anweisungen aber schwierig. Denn Block Themes arbeiten nun mal nicht mit PHP-Templates. Einfach mal so etwas PHP über den Code Editor einzufügen, funktioniert also nicht.

Was im Falle der geschätzten Lesezeit nun nicht das Problem darstellt. Was ich ohnehin schon längst hätte tun sollen, drängt sich bei einem Block Theme nun auf. Ich erstelle also für meine Custom Post Types eigene Templates. Das war schon vor WordPress 6.1 möglich. Es gestaltet sich nach dem Update aber viel leichter.

Im Fall der geschätzten Lesezeit erfolgt ihr Aufruf also nur im Template der normalen Beiträge. Im Template für die Custom Post Types fällt er einfach weg. So lässt sich das Problem, dass WordPress (noch?) keine Option für bedingte Anweisungen bietet, umschiffen.

Doch was ist mit Hinweisen, die besagen, dass der Beitrag bereits zwei Jahre alt ist? Oder dass es sich um einen überarbeiteten und wieder veröffentlichten Beitrag handelt? Und noch besser: dass der überarbeitete und wieder veröffentlichte Beitrag nun schon wieder veraltet ist?

Mir war nicht klar, wie ich WordPress beibringen soll, solche Bedingungen nun im Rahmen eines Block Themes zu erfüllen.

Die Struktur an sich ist einfach. In dem Template Singular habe ich drei Absätze erstellt:

  • Der erste zeigt den Disclaimer für alle Beiträge der Kategorie 'blog', die älter als zwei Jahre sind.
  • Der zweite Absatz benennt die Überarbeitung und Wiederveröffentlichung für alle Beiträge der Kategorie 'republished'.
  • Und im dritten Absatz geht es darum, dass diese erneuerten Beiträge schon wieder alt sind.

Nur wie hinterlege ich für diese drei Absätze die jeweils passende bedingte Anweisung?

Mit Block Logic zu Bedingungen für WordPress Block

Auf der Suche nach einem Plugin für das Hinterlegen von Conditional Tags für WordPress Blöcke wurde ich schnell fündig. Ob nun mit dem Suchbegriff Conditional Blocks oder Block Visibility fand ich Anbieter für entsprechende Funktionen.

Doch brauche ich nicht so viel Funktion und Optionen, die nach Benutzerrolle, Wochentag, Uhrzeit, Gerät oder was auch immer fragen. Was ich brauche, ist die Möglichkeit, nach Kategorie und einer eigenen Funktion zu filtern.

Tatsächlich stieß ich dann nur per Zufall auf das Plugin Block Logic.

Block Logic hat kein eigenes Menü für Einstellungen. Das Plugin sorgt schlicht dafür, das Panel Erweitert eines jeden Blocks um ein Feld für die Bedingung zu erweitern.

Block Logic erweitert das Panel "Erweitert" für jeden WordPress Block und bietet so die Option für das Hinterlegen von Bedingungen
Bedingung für den Absatzblock, der den Disclaimer für alte Beiträge liefert

Was Sie dort in dieses Feld dann eingeben, ist ganz Ihre Sache. Die einzige Bedingung: Es sollte sich schon um eine valide PHP-Bedingung handeln, die wahr oder falsch zurückgibt.

Ein paar Beispiele für solche PHP-Bedingungen liefert Block Logic in seinen FAQ. Weit mehr ist möglich. Aber ich brauche zum einen ja nur ein schlichtes in_category('blog') im Vergleich zu in_category('republished').

Und siehe da: All das Klammer-Gedöns, das es im Rahmen einer PHP-Datei bräuchte und im Zweifel fehleranfällig ist, fällt hier weg. Im Zweifel muss nur die Kombination von Bedingungen mittels Operatoren (»und«/»oder«) stimmen.

Neue Funktion für alte Beiträge

Um an dieser Stelle nun eine Anweisung für die Kennzeichnung alter Beiträge im Gegensatz zu jüngeren geben zu können, brauchte ich zwei neue Funktionen.

Der Code, mit dem ich bis dato arbeite, wusste ich nicht für mein Anliegen umzusetzen. Nun fand ich bei isitwp eine Funktion, mit der ich arbeiten kann:

function is_old_post($days = 730) {
    $days = (int) $days;
    $offset = $days*60*60*24;
    if ( get_post_time() < date('U') - $offset )
         return true; 
    return false;
 }

Diese Funktion gehört in die functions.php des Block Themes (beziehungsweise des Child Themes eines Block Themes). Und lässt sich dann auch modifizieren, sodass sich auch eine Bedingung formulieren lässt für Beiträge, die jünger als zwei Jahre sind:

function is_young_post($days = 730) {
    $days = (int) $days;
    $offset = $days*60*60*24;
    if ( get_post_time() > date('U') - $offset )
         return true; 
    return false;
 }

In beiden Fällen geht es um die Ermittlung des Alters von Beiträgen. 730 Tage, das sind zwei Jahre.

Im ersten Fall der alten Beiträge geht es also darum, dass der Beitrag vor mehr als 730 Tage veröffentlicht wurde. Im zweiten Fall wurde der Beitrag vor weniger als 730 Tagen veröffentlicht. Der entscheidende Unterschied liegt nicht nur in der Benennung is_old_post im Gegensatz zu is_young_post. Er liegt in der vierten Zeile, in der get_post_time() kleiner oder größer ist als date('U') - $offset.

Beide Funktionen bieten mir nun den passenden Conditional Tag. Für die alten Beiträge ist dies is_old_post(). Für die jüngeren Beiträge ist es is_young_post().

Bedingte Anweisung für Absatz-Blöcke zum Hinweis auf das Beitragsalter

Jetzt habe ich also drei Bedingungen, die WordPress versteht und dazu bringt, den betreffenden Absatz-Block anzuzeigen – oder eben nicht.

is_old_post() && in_category('blog')

Die erste Bedingung sorgt dafür, dass Blogbeiträge, die älter als zwei Jahre sind, den Disclaimer anzeigen, der darauf hinweist, dass auch ihr Inhalt veraltet sein könnte.

is_young_post(730) && in_category('republished')

Die zweite Bedingung sorgt dafür, dass Beiträge, die ich überarbeitet und wieder veröffentlicht und mit ‚republished‘ kategorisiert habe, diesen Hinweis zeigen – bis sie zwei Jahre alt sind.

is_old_post(730) && in_category('republished')

Und die dritte Bedingung sorgt dafür, dass Beiträge der Kategorie republished, die älter als zwei Jahre sind, den entsprechenden Disclaimer anzeigen.

Fazit zu den WordPress Block Bedingungen

In meinem Beitragsbild lasse ich kleine Blöcke regnen nach der Logik: Wenn nicht das eine, dann das andere. If – else.

Leider erkenne ich bei Block Logic, das sich ja immer auf einen einzelnen Block bezieht, nicht, wie ich eine derartige Logik herstellen könnte. Das mag an meinem Unvermögen liegen. Oder es liegt einfach nicht in der Logik des Plugins.

Nun führen aber nicht nur mehrere Wege nach Rom. Auch in Sachen WordPress gibt es eigentlich immer alternative Wege, um ein Ziel zu erreichen. Mein Ziel, je nach Bedingung einen von drei Blöcken auszugeben, konnte ich mit dem Plugin jedenfalls erreichen.


Beitragsbild: Britta Kretschmer

Schreibe einen Kommentar

Die im Rahmen der Kommentare angegebenen Daten werden von mir dauerhaft gespeichert. Cookies speichere ich nicht. Für weitere Informationen siehe bitte meine Datenschutzerklärung.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert