WordPress: Übergeordnete Templates im Child Theme überschreiben


Es gibt zwei Dinge die einem das Arbeiten als WordPress Theme Entwickler wirklich einfach und schmackhaft machen: Child Themes und die WordPress Template Hierarchie. Beides spart einem jede Menge Zeit und Nerven. Meistens jedenfalls. Leider gibt es genau einen Punkt an dem beides zusammen zu einem Problem wird: Wenn ein Parent Theme eine Template Datei enthält, die man im Child Theme überhaupt nicht nutzen will. Um das Problem (und seine Lösung) genauer zu verstehen muss ich ein wenig ausholen:

Die WordPress Theme Hierarchie

Um ein WordPress Theme entwickeln zu können braucht man nur genau zwei Dateien: Einmal die style.css (Theme Informationen und Styling) und eine index.php (Markup und Funktionalität). Zwar sollte man die Funktionalität weitestmöglich in die functions.php auslagern, diese ist aber nicht obligatorisch. Die zwei oben genannten Dateien reichen völlig um ein funktionstüchtiges WordPress Theme auf die Beine zu stellen. Die index.php wird dabei als Template für alle Seiten, Postings, Anhänge usw. herangezogen. Möchte man nun einen speziellen Bereich etwas anders aufbauen kann man eine spezifischere Template-Datei anlegen. Z.B: kümmert sich die Datei singular.php um alle einzelnd angezeigten Elemente, also eine einzelne Seite, ein einzelner Beitrag, ein einzelner Anhang usw. Leg ich jetzt noch eine Datei mit dem Namen page.php an kümmert diese sich nur um eine einzelne Inhaltsseite, nicht aber um einen einzelnen Artikel. Man kann am Ende so spezifisch werden, dass man für eine einzelne Seite mit einer speziellen ID ein komplett eigenes Template anlegt (page-ID.php).

Eine gute Übersicht zu den einzelnen Templates und deren Spezifität findet sich übrigens hier.

Man kann also einfach und schnell anfangen und kann dann, wenn nötig, bis ins kleinste Detail spezifisch werden.

WordPress Child Themes

Ein weiterer Vorteil von WordPress sind sogenannte Child Themes. Zum Thema habe ich hier schon vor längerer Zeit etwas geschrieben, deshalb hier nur ein paar Sätze zu Child Themes: Man kann in Child Themes alle Änderungen eines Parent Themes auslagern. Das Parent Theme bleibt damit updatefähig und einmal gemachte Änderungen werden nicht überschrieben. Dies ist vor allen Dingen dann sinnvoll wenn man zwar selber kleine Änderungen vornehmen will, dass eigentliche Parent Theme aber von Dritten laufend weiterentwickelt wird.

Das Problem: Parent Themes mit sehr vielen spezifischen Templates

Benutzt man jetzt ein Parent Theme mit sehr vielen spezifischen Templates und will für dieses ein Child Theme anlegen, das sehr viel weniger Unterschiede hat, wirds etwas hakelig. Legt man beispielsweise im child Theme eine index.php Datei an, wird dieser nicht benutzt, sofern das Parent Theme eine spezifischere home.php hat. Man muss also auch im Child Theme ein home.php Datei anlegen, auch wenn diese genau den gleichen Inhalt haben soll wie die index.php. Und so gehts dann fröhlich weiter. Und wenn man mal an einer Datei etwas ändert, muss das auch an allen anderen geändert werden. Arbeitet man jetzt mit einem größeren Theme Framework, können dass mal schnell mehrere Dutzend dateien sein.

Die Lösung: Mit get_template_part eine Datei in eine andere einfügen

Greifen wir mal obiges Beispiel auf: Wir brauchen in unserem Child Theme nur eine index.php. Unser Parent Theme kommt aber auch mit einer home.php daher. Damit wir nicht zwei verschiedene Dateien pflegen müssen legen wir zwar dennoch eine home.php Datei in unserem Child Theme Verzeichnis an, fügen aber nur folgendes ein:

<?php // Overwrites the parent themes home.php with child themes index.php get_template_part( 'index' ); ?>

Jetzt wird richtigerweise die home.php Datei des Child Themes gefunden und geladen, diese macht aber nichts anderes als den Inhalt der index.php auszugeben.

Einmal angelegt brauchen wir uns also um die home.php nicht mehr kümmern.