Wie der WordPress Loop im WordPress Theme funktioniert

Der WordPress Loop ist ein wichtiger Bestandteil jedes WordPress Themes und wird zur Anzeige von allen Posts verwendet. Dieses Tutorial erklärt Anwendung und Funktionsweise des WordPress Loops im Detail und zeigt auf, wie und wo der Loop zum Einsatz kommt.

Was ist der WordPress Loop?

Der WordPress Loop dient zur Anzeige von Posts im WordPress Theme. Er ist damit eine zentrale Komponente jeder WordPress Website. Wie der Name Loop bereits erkennen lässt, handelt es sich um eine Schleife im Programmcode.

Der WordPress Loop wird häufig mehrfach durchlaufen, beispielsweise zur Darstellung von mehreren Beiträgen auf der Blog Seite und in Archiven. Für einzelne Beiträge und statische Seiten kommt der Loop ebenfalls zum Einsatz, die Schleife ist nur nach einem Durchlauf bereits beendet.

Technisch umgesetzt ist der WordPress Loop mit etwas PHP Code als while-Schleife:

while ( have_posts() ) :
    the_post();

    // Display Post Content
    get_template_part( 'template-parts/content' );

endwhile;

Beispiel: Zur Darstellung von 10 Beiträgen auf der Blog Seite wird die while-Schleife im Theme 10 Mal durchlaufen. Jeder einzelne Post wird mit dem Code innerhalb des Loops dargestellt. Meistens wird dazu eine zusätzliche Template Datei geladen.

Wo findet man den WordPress Loop?

Der Loop in WordPress ist eng verknüpft mit einer Datenbankabfrage. Zur Darstellung von Content in WordPress wird praktisch immer zuerst eine Abfrage mit WP_Query ausgeführt und das Ergebnis danach im WordPress Loop ausgegeben.

Ersichtlich wird diese Verknüpfung beim Blick auf einen Custom Query und Custom Loop:

// The Query
$custom_query = new WP_Query( $args );

// The Loop
if ( $custom_query->have_posts() ) {

	while ( $custom_query->have_posts() ) {
		$custom_query->the_post();
		// Display Post
	}
	wp_reset_postdata();
}

Zum Thema Custom Queries schreibe ich aber bald einen weiteren Artikel.

Meistens wird jedoch mit WordPress Loop der Default Loop bezeichnet, welcher sich in den Template Dateien des Themes wiederfinden lässt. Dieser Standard WordPress Loop im Theme wird zur Anzeige des WordPress Main Queries verwendet.

Auch der WordPress Loop in den Template Dateien des Themes ist also mit einer Datenbankabfrage verknüpft, auch wenn diese hier nicht direkt im Code des Themes zu finden ist, sondern bereits vom WordPress Core ausgeführt worden ist.

Wie sieht der WordPress Loop im Theme aus?

Nicht alle Template Dateien im Theme haben die Aufgabe, den WordPress Main Query anzuzeigen. Typische Templates, die einen WordPress Loop aufweisen, sind zum Beispiel index.php, home.php, archive.php, single.php und page.php.

Andere Dateien wie header.php, footer.php, comments.php oder sidebar.php stellen nur Komponenten dar und enthalten deshalb keinen WordPress Loop. Mehr Details findest du in meinem Beitrag über die verschiedenen Template Dateien in einem WordPress Theme.

Der WordPress Loop könnte beispielsweise so in der archive.php eingesetzt werden:

<?php 
if ( have_posts() ) :

    the_archive_title( '<h1 class="page-title">', '</h1>' );

    // Start the loop.
    while ( have_posts() ) :
        the_post();

        get_template_part( 'template-parts/content' );

    endwhile;

    the_posts_pagination();

else :
    get_template_part( 'template-parts/content', 'none' );
endif;
?>

Zu Beginn wird überprüft, ob überhaupt Beiträge vorhanden sind. Wenn nicht, wird mit content-none.php eine entsprechende Meldung ausgegeben. Anderfalls wird der Titel des Archives (Kategorie, Schlagwort, Monatsarchiv) angezeigt und der WordPress Loop gestartet.

Die while-Schleife (= WordPress Loop) wiederholt sich solange, bis alle Beiträge komplett dargestellt sind. Standardmäßig werden in Archiven 10 Beiträge pro Seite angezeigt, und eine Nummerierung für ältere Beiträge angeboten. Das übernimmt the_posts_pagination() nach dem Ende des WordPress Loops.

Einzelne Beiträge werden in der single.php dargestellt.

Auch hier kommt ein WordPress Loop zum Einsatz:

<?php
// Start the loop.
while ( have_posts() ) :
    the_post();

    get_template_part( 'template-parts/content', 'single' );

    comments_template();

endwhile;
?>

Die single.php wird nur aufgerufen, wenn der Beitrag existiert. Sonst zeigt WordPress gleich die 404.php. Deshalb kann auf eine if-Abfrage verzichtet werden. Anstatt content.php wird hier content-single.php für die Anzeige des Beitrags geladen. Zusätzlich werden noch die Kommentare eingebunden.

Die Funktionen des WordPress Loops

Schauen wir uns nun die Funktionen im WordPress Loop genauer an:

have_posts()

Ein Blick in die Funktion zeigt, dass diese nur aus zwei Zeilen besteht:

function have_posts() {
    global $wp_query;
    return $wp_query->have_posts();
}

Es handelt sich um eine sogenannte Wrapper Funktion. WordPress speichert den Main Query in der globalen Variable $wp_query, welche eine Objektinstanz der Klasse WP_Query ist. Die Wrapper Funktion macht diese Variable zugänglich und ruft die Methode have_posts() von WP_Query auf.

WP_Query::have_posts() überprüft, ob noch weitere Posts im WordPress Main Query vorhanden sind, die angezeigt werden können. Die Methode gibt dabei solange true zurück, bis der interne Counter von WP_Query am Ende angelangt ist. Beim letzten Post oder wenn gar keine Posts gefunden werden, ist der Rückgabewert dann false.

Durch diesen Umstand kann have_posts() an zwei Stellen verwendet werden:

1. Zur Überprüfung, ob überhaupt Posts vorhanden sind
if ( have_posts() )

2. Zum Durchlaufen aller Posts in der while-Schleife als while-Bedingung
while( have_posts() )

the_post()

Auch bei the_post() handelt es sich lediglich um einen Wrapper:

function the_post() {
    global $wp_query;
    $wp_query->the_post();
}

Die WP_Query Methode the_post() dient zum Setup des Posts und ruft dafür zwei weitere Methoden auf. Zum einen die Funktion next_post(), welche den internen Counter $current_post um 1 hochzählt.

Zum anderen die Methode setup_postdata(), welche einige globale Variablen für den Post setzt und damit verschiedene Template Tags innerhalb des Loops möglich macht. Ohne dem Aufruf von the_post() würden deshalb viele Template Tags innerhalb des Loops nicht wie gewünscht funktionieren.

Beispiel: Im Post Setup wird die globale Variable $authordata definiert, die u.a. von der Template-Funktion the_author() zur Anzeige des Autors genutzt wird.