Bildquelle: Pixabay

Template Dateien mit get_template_part() in WordPress laden

In diesem Beitrag erkläre ich den Vorteil und Zweck von Template Parts und die Verwendung der WordPress Funktion get_template_part, welche zum Laden von Template Dateien im WordPress Theme eingesetzt wird.

Vor einigen Wochen habe ich bereits ein Einsteiger-Tutorial über die verschiedenen Template Dateien in einem WordPress Theme geschrieben. Dort habe ich bereits erwähnt, dass Theme Entwickler Template Dateien in einzelne, sogenannte Template Parts aufteilen können.

Diese Template Parts werden mit der Funktion get_template_part() geladen.

Vorteil und Zweck von Template Parts

Template Parts sind vor allem nützlich, weil sie mehrfach an unterschiedlichen Stellen im Theme verwendet werden können.

Blog Beiträge werden beispielsweise auf der Startseite, in Kategorien, Autor-Archiven oder in den Suchergebnissen dargestellt. Anstatt nun den gleichen Code in vier verschiedenen Dateien home.php, category.php, author.php und search.php einbauen und pflegen zu müssen, kann dieser in einer einzigen Template Datei content.php ausgelagert werden.

Wiederholungen und Redundanzen werden dadurch vermieden, getreu dem Motto:

Don’t repeat yourself!

Warum get_template_part() verwendet werden soll

Wer etwas mit PHP vertraut ist, weiß, dass mit include und require bereits zwei Funktionen zum Laden von PHP Dateien in der Programmiersprache vorhanden sind. Als WordPress Theme Entwickler wird man diese auch einsetzen, um weitere Funktionsdateien in der functions.php des Themes zu laden.

Zum Einbinden von Template Dateien stellt WordPress jedoch eine Reihe von eigenen Funktionen bereit, unter anderem get_template_part().

Der Grund dafür ist die Erweiterbarkeit durch Child Themes und Plugins!

Die Funktionen überprüfen zuerst, ob die geladene Datei in einem Child Theme vorhanden ist und von dort geladen werden kann, oder alternativ das Template des Parent Themes genutzt wird. Template Dateien werden somit erst durch die Nutzung dieser Funktionen mit einem Child Theme überschreibbar.

Darüber hinaus beinhalten die meisten Funktionen zusätzliche Action Hooks, wodurch Plugins in das Laden der Template Dateien eingreifen können.

Als Theme Entwickler sollte man deshalb immer die WordPress Funktionen anstatt include und require zum Einbinden von Template Dateien nutzen, um die Erweiterbarkeit seines Themes durch Child Themes und Plugins zu gewährleisten.

Template Dateien mit get_template_part() laden

Die Funktion nimmt zwei Parameter entgegen:

get_template_part( $slug, $name );

Der erste Parameter muss übergeben werden, der Zweite ist optional und dient zur Auswahl einer noch spezielleren Template Datei.

Allgemeine Template Datei laden

Um die Template Datei content.php einzubinden – beispielsweise innerhalb des WordPress Loops – genügt der Aufruf der Funktion mit Übergabe des Slugs content:

<?php get_template_part( 'content' ); ?>

Die content.php übernimmt dann die Darstellung des Beitrags und kann dabei in mehreren Templates geladen werden, z.B. der archive.php, index.php und search.php.

Spezielle Template Datei laden

Zum Laden einer speziellen Template Datei kann der zweite Parameter übergeben werden.

Dieser kann zum Beispiel verwendet werden, um zur Darstellung eines Beitrags in der Einzelansicht eine andere Datei aufzurufen.

<?php get_template_part( 'content', 'single' ); ?>

WordPress versucht mit Angabe des zweiten Parameters nun, das speziellere Template content-single.php zu laden. Falls dieses nicht vorhanden ist, wird als Fallback das generelle Template content.php verwendet.

Die Ladereihenfolge ist deshalb wie folgt:

/child-theme/content-single.php
/parent-theme/content-single.php
/child-theme/content.php
/parent-theme/content.php

Wegen diesem Fallback-Mechanismus nimmt die Funktion auch zwei Parameter entgegen.

Nicht ganz richtig wäre demnach:

<?php get_template_part( 'content-single' ); ?>

Template Dateien variabel laden

Als zweiter Parameter kann auch eine Variable oder Funktion übergeben werden.

In TwentySeventeen wird z.B. die Funktion get_post_format() verwendet, um damit ein spezielles Template für das jeweilige Post Format einzubinden:

/* Start the Loop */
while ( have_posts() ) : the_post();

    get_template_part( 'content', get_post_format() );

endwhile;

Je nach Post Format wird WordPress versuchen, content-audio.php, content-gallery.php, content-image.php usw. zu laden. Bei nicht vorhandenen Template Dateien wird auf content.php zurückgegriffen.

Template Dateien in Ordnern laden

Sehr häufig wird man Template Dateien in Unterordnern im Theme auslagern wollen, anstatt mit diesen das Root-Verzeichnis des Themes aufzublähen.

Hierfür kann einfach der Ordnername dem Dateinamen vorangestellt werden:

<?php get_template_part( 'template-parts/content', 'single' ); ?>

Nun wird die Datei content-single.php vom Ordner template-parts geladen.

2 Kommentare

  1. Hi Thomas

    Danke für die gute und ausführliche Erläuterung von .
    Wie kann ich dieser Funktion noch einen spezifischen Post oder eine Page mitgeben?

    In anderen Worten: Ich will eine Reihe an Templates gestalten (wide, narrow, …), diese mit auf meiner Homepage abbilden aber verschiedene Inhalte aus verschiedenen Posts darstellen. Also das, was viele Kauf-Templates als sogenannte „Sections“ anbieten.

    Gibt es da eine Möglichkeit? Oder bin ich komplett auf dem Holzweg?

    Grüße aus Berlin

    1. Hallo Tibor,

      Dem zweiten Parameter von get_template_part() kann eine Variable mitgegeben werden. Dort kann theoretisch auch der Slug / URL eines Posts eingesetzt werden.

      Grundsätzlich bestimmt aber das Template nur, wie etwas angezeigt wird.

      Was angezeigt wird (d.h. welche Inhalte bzw. Posts), hängt eher von der Datenbankabfrage ab, also dem Main Query oder eigene Abfragen mit WP_Query.

      Das komplette Template System ist für WordPress Einsteiger oft sehr kompliziert zu durchschauen. Hier würde ich auch erst einmal das Lesen diesen Beitrags empfehlen: https://themecoder.de/2017/02/07/uebersicht-der-verschiedenen-template-dateien-in-einem-wordpress-theme/

      Viele Grüße,
      Thomas

Schreibe einen Kommentar zu Tibor Antworten abbrechen

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