Pluggable Template-Funktionen im WordPress Child Theme modifizieren
Mit Child Themes stehen sehr viele verschiedene Optionen bereit, mit denen du dein Parent Theme anpassen kannst. In diesem Tutorial der Serie über Child Themes erkläre ich, wie du pluggable Template-Funktionen im WordPress Child Theme modifizieren kannst.
Im letzten Teil der Serie über Child Themes habe ich erklärt, wie du Template-Dateien des Themes in einem Child Theme überschreiben kannst. Heute zeige ich, wie auch die recht ähnlichen Template-Funktionen eines Themes mit einem Child Theme angepasst werden können.
Was sind Template-Funktionen bzw. Template Tags?
Template Tags sind PHP-Funktionen, die HTML-Markup direkt mit echo ausgeben oder mit return zurückgeben. Template-Funktionen dienen zur Anzeige eines bestimmten Elements im Theme und sind meistens auf diesen Zweck spezialisiert.
Zwei Template-Funktionen in Twenty Seventeen sind zum Beispiel:
- twentyseventeen_posted_on()
Zeigt Datum und Autor eines Posts - twentyseventeen_entry_footer()
Zeigt Kategorien, Schlagworte und Kommentare des Beitrags
Exkurs: Wie du eigene Template-Funktionen für Beitrags-Details in deinem WordPress Theme erstellen kannst, habe ich bereits in den Beiträgen Datum und Autor im WordPress Theme anzeigen und WordPress Kategorien im Theme ausgeben dargelegt.
Template-Funktionen sind wiederverwendbar und können damit an mehreren Stellen im WordPress Theme eingesetzt werden. Anstatt den gleichen Code mehrmals in verschiedenen Templates wiederholen zu müssen, wird dieser einfach in der Template-Funktion ausgelagert.
Unterschied von Template-Funktionen und -Dateien
Im Gegensatz zu Template-Dateien erfolgt die Ausgabe des HTML-Markups nicht mit dem Laden der kompletten Datei, sondern mit dem Aufruf der Template-Funktion. In der content-single.php eines Themes könnte z. B. der Template Tag für Datum und Autor aufgerufen werden:
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php theme_slug_posted_on(); // Unsere Template-Funktion. ?>
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
</header>
...
</article>
Häufig ist es die Entscheidung des Entwicklers, ob er eine Funktion oder Datei nutzt, denn auch Template-Dateien sind wiederverwendbar. Theme Entwickler können neue Template-Dateien anlegen und diese als Template Partials mit get_template_part() in anderen Templates einbinden.
Eine grobe Daumenregel: Bei überwiegend HTML-Markup wie die Darstellung eines Posts im Loop wird aber eher eine eigenständige Template-Datei eingesetzt, bei kleineren Elementen wie Post Meta, Pagination oder Footer Credits eher eine Template-Funktion.
Ein großer Vorteil von Template-Funktionen ist, dass diesen sehr einfach Variablen übergeben werden kann und damit die Ausgabe mit verschiedenen Parameter kontrollierbar ist.
Pluggable Funktionen im Parent Theme erkennen
Template-Funktionen lassen sich – wie der Name vermutet – in der functions.php des Themes finden. Bei nahezu allen Themes werden jedoch nicht alle Funktionen in diese eine Datei gestopft, sondern für mehr Übersichtlichkeit und Struktur in mehrere Dateien aufgeteilt und mit require am Ende der functions.php geladen.
Sehr häufig lassen sich die Template-Funktionen in /inc/template-tags.php des Parent Themes finden. Ansonsten hilft eine Analyse der functions.php und aller von dort eingebundener Dateien.
Die PHP-Datei enthält üblicherweise eine ganze Ansammlung von Template Tags. Um die Template-Funktionen im WordPress Child Theme zu modifizieren, wird jedoch nicht die ganze Datei überschrieben, sondern nur die einzelne Funktion.
Damit die Template-Funktion mit einem Child Theme überschrieben werden kann, muss es sich um eine Pluggable Function handeln, d.h. der Entwickler des Parent Themes muss die Funktion erst überschreibbar implementiert haben, damit sie modifizierbar ist.
Pluggable Functions erkennt man an einem Wrapper mit function_exists() um die Funktion:
if ( ! function_exists( 'twentyseventeen_posted_on' ) ) :
/**
* Prints HTML with meta information for the current post-date/time and author.
*/
function twentyseventeen_posted_on() {
// Function Code.
}
endif;
Mit der If-Clause wird überprüft, ob die Funktion twentyseventeen_posted_on() schon definiert wurde. Falls noch keine Funktion mit dem gleichen Namen existiert, wird die Template-Funktion im Parent Theme eingebunden.
Wie du Template-Funktionen im WordPress Child Theme überschreiben kannst
Mit diesem Mechanismus ist nun ein Überschreiben der Template-Funktion möglich.
Nachdem du die Template-Funktion, welche du anpassen willst, identifiziert hast, kannst du die ganze Funktion ohne die If-Abfrage vom Parent Theme kopieren und in die functions.php des Child Themes einfügen. Der Name der Funktion bleibt gleich und darf nicht geändert werden.
/**
* Prints HTML with meta information for the current post-date/time and author.
*/
function twentyseventeen_posted_on() {
// Original-Code der Funktion, der nun angepasst werden kann.
}
Anschließend kannst du die Template-Funktion nach deinen Wünschen im Child Theme ändern.
WordPress wird nun deine modifizierte Template-Funktion aus dem Child Theme nutzen. Die Funktion im Parent Theme wird nicht mehr verwendet, weil die gleichnamige Funktion bereits im Child Theme definiert wurde und die If-Abfrage mit ! function_exists() ein false liefert.
Achtung! Aus diesem Grund können auch nur pluggable Template-Funktionen im WordPress Child Theme angepasst werden. PHP wird sofort einen Fehler ausspucken, wenn eine normale Funktion ein zweites Mal im Child Theme definiert wird. Funktionsnamen müssen eindeutig sein.
Wie die functions.php im Child Theme funktioniert
Möglich wird die Modifikation von Template Tags durch die Funktionsweise von Child Themes und dem Laden der functions.php. Anders als bei Template-Dateien überschreibt die functions.php des Child Themes nicht die des Parent Themes, sondern wird zusätzlich geladen.
Lade-Reihenfolge der Theme-Dateien:
- WordPress läd die functions.php des Child Themes
- WordPress läd die functions.php des Parent Themes
- WordPress läd eine Template-Datei anhand der Template-Hierarchie:
- Existiert das Template im Child Theme? Dann wird es von dort geladen.
- Template im Child nicht vorhanden? Dann wird es vom Parent Theme geladen.
Während bei überschriebenen Template-Dateien nur der Code des Templates vom Child Theme eingebunden wird, läd WordPress bei jedem Aufruf die functions.php von beiden Themes.