Duplikate im Loop von WordPress filtern

Die Loop in den Templates des Theme in WordPress ist das Herz einer jeden Ausgabe. Mit zunehmenden Anforderungen wird die Aufgabe an den Entwickler aufwendiger und das Default-Theme von WordPress hilft nicht weiter als Vorlage. Nicht selten muss daher mit klassichen PHP-Möglichkeiten im Template die Umsetzung realisiert werden, denn es gibt dafür keine eigene Funktion oder Template Tag, wie einige Nutzer meinen. Da die Frage recht oft auftaucht und man in dem Fall eine Lösung aufzeigen kann, möchte ich mal darstellen, wie ich dafür sorge, dass Inhalte, die in einem Loop ausgegeben wurden, nicht in einem weiteren Loop nochmal dargestellt werden.

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 7 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

Die Loop in den Templates des Theme in WordPress ist das Herz einer jeden Ausgabe. Mit zunehmenden Anforderungen wird die Aufgabe an den Entwickler aufwendiger und das Default-Theme von WordPress hilft nicht weiter als Vorlage.
Nicht selten muss daher mit klassichen PHP-Möglichkeiten im Template die Umsetzung realisiert werden, denn es gibt dafür keine eigene Funktion oder Template Tag, wie einige Nutzer meinen. Da die Frage recht oft auftaucht und man in dem Fall eine Lösung aufzeigen kann, möchte ich mal darstellen, wie ich dafür sorge, dass Inhalte, die in einem Loop ausgegeben wurden, nicht in einem weiteren Loop nochmal dargestellt werden.

WordPress identifiziert Beiträge und Seiten eindeutig via ID, die in der Datenbank angelegt sind und die auch bei der Ausgabe in der Loop eine entscheidende Rolle spielen. Alle Zuordnungen oder Verknüpfungen basieren auf der ID. Daher speichere ich im ersten Loop (Loop Nr.1) die IDs, die ausgeben werden, in einem Array. Diese Variable wurde im Vorfeld als Array bestimmt $do_not_duplicate = array();.

Loop Nr.1


<?php
$do_not_duplicate = array(); // vor den Loops Variable als Array setzen  

// 1. Loop
query_posts('ca=1,2,3&showposts=5');
while ( have_posts() ) : the_post();
    $do_not_duplicate[] = $post->ID; // IDs im Loop merken 
    // Post ausgeben ...
    the_title();
endwhile;
?>

Nach dem nun durch die obige Loop 5 Artikel ausgegeben wurden, haben wir im Array 5 IDs, mit denen wir nun arbeiten können. Im Übrigen kann man sich das Array mit der PHP-Funktion var_dump() anschauen.

In der kommenden Loop Nr.2 sollen nun 15 Beiträge ausgegeben werden, wobei die schon aus Loop Nr. 1 bekannten IDs nicht nochmal erscheinen sollen. Dies könnte sein, wenn Beiträge mehreren Kategorien zugeordnet sind, da beide Loops unterschiedliche Kategorien ausgeben. Ich prüfe nun mit der Funktion in_array(), ob die aktuelle ID $post->ID im Array $do_not_duplicate vorhanden ist. Nur wenn die ID nicht ( !in_array() ) im Array vorhanden, dann wird im Loop Nr. 2 Inhalt ausgegeben.

Loop Nr.2


<?php
// 2. Loop
query_posts( 'cat=4,5,6&showposts=15' );
while (have_posts()) : the_post();
    if ( !in_array( $post->ID, $do_not_duplicate ) ) { // IDs prüfen
        // Post ausgeben ...
        the_title();
    }
endwhile;
?>

Wie so oft, gibt es eine Alternative und dazu stellt WordPress einen Parameter im Query bereit - post__not_in, siehe Codex. Auch diesem Parameter übergebe ich alternativ den Array und in diesem Query sind dann die IDs nicht enthalten. Je nach dem, welchen Weg man geht, stehen damit zwei unterschiedliche Syntax bereit, um doppelten Content zu vermeiden.


<?php
// weiterer Loop ohne Duplikat
query_posts( array(
    'cat' => 456,
    'post__not_in' => $do_not_duplicate 
    )
);
while ( have_posts() ) : the_post();
    // Post ausgeben ...
        the_title();
endwhile;
?>

Comments are closed.