Der treibende Motor hinter WordPress ist die sogenannte Loop. Letztlich ist selbige eigentlich nur eine Schleife, in der die Beiträge, die zuvor aus der Datenbank geholt wurden, entsprechend aufbereitet und ausgegeben werden. Natürlich folgt man dabei dem chronologischen Ansatz, d.h. die Beiträge werden zeitlich auf- oder absteigend sortiert und abgearbeitet. Diese Auswahl lässt sich eingrenzen, beispielsweise in dem man nur Beiträge aus einer bestimmten Kategorie oder einem bestimmten Zeitraum abfragt. Aber über all dem steht diese Chronologie.
WordPress bietet für diesen Fall mehr als genug Möglichkeiten, durch Funktionen an die entsprechenden Beiträge zu kommen. Was aber, wenn man eine Loop haben möchte, die sich aus Beiträgen zusammensetzen soll, die zuvor in keiner Relation standen, die keine gemeinsamen Merkmale haben und auch nicht aufeinanderfolgend sind? Oder man möchte eine Serie von Beiträgen haben, deren Reihenfolge man im Vorfeld noch gar nicht weiss, weil sie erst aufgrund bestimmter anderer Bedingungen zusammengestellt wird? In diesem Fall muss man sich die Loop selber basteln.
Der Code
Dieser Code wurde mit WordPress 2.0.3 erstellt und verifiziert. Da aber nicht an WordPress vorbei abfragt wird, sollte der Code auch in der Zukunft funktionieren. Als Ausgangssituation möchte man die Beiträge mit den IDs 23, 42, 239, 3 und 79 in genau dieser Reihenfolge haben. WordPress selber bietet die Klasse $wpdb an, die für alle Interaktionen mit der Datenbank zuständig ist und alles nötige zur Verfügung stellt. Zuerst ein Beispiel einer klassischen Loop:
<?php query_posts('showposts=5');
if(have_posts()) : while(have_posts()) : the_post() ?>
... Ausgabe ...
<php endwhile; endif; ?>
Dieser Codeblock fragt die letzten 5 Beiträge ab und gibt sie, sofern vorhanden aus. Als erstes muss die Abfrage geändert werden.
<?php $order = "23,42,239,3,79";
$myposts = $wpdb->get_results("SELECT * FROM $wpdb->posts
WHERE ID IN ($order)
ORDER BY FIELD(ID, $order)"); ?>
$wpdb->get_results erstellt eine Abfrage an die Datenbank mit dem angegebenen Parameter und liefert das Ergebnis zurück, in diesem Falle in die Variable $myposts. Der Name der Variablen ist dabei nicht zufällig gewählt, WordPress benutzt ihn normalerweise auch, man spart sich so einen Aufruf der Funktion get_posts(). Das Statement selber kann man wörtlich etwa so übersetzen, dass er alle Beiträge holen soll, deren ID eine der fünf Gewünschten ist. Das Ergebnis soll ebenfalls nach diesen fünf Werten sortiert werden.
Die normalerweise folgende Abfrage, ob Beiträge vorhanden sind, greift hier nicht, daher muss man sich anders behelfen:
<?php if($myposts) : foreach($myposts as $post) :
setup_postdata($post);
... Formatierungen ...
endforeach; endif; ?>
Es wird einfach überprüft ob $myposts vorhanden ist (ist der Fall, sobald Beiträge abfragt werden konnten). Danach wird einfach jeder Beitrag abgearbeitet. Die Funktion setup_postdata() sorgt für die Aufbereitung des einzelnen Beitrags, so dass die bekannten Funktionen wie the_title(), the_content() usw. funktionieren.
Schluss
Wie man sieht ist es gar nicht so schwer, sich seine eigene Loop zusammen zu stellen. Die Aufbereitung unterscheidet sich nicht, das größte Problem könnte für manche noch das SQL-Statement sein, das benötigt wird, um die Beiträge aus der Datenbank zu holen. Zum einen muss man die Struktur der Tabellen kennen, was aber im Codex dokumentiert ist. Zum anderen ist grundlegendes Wissen über SQL nötig, wer da Hilfe braucht kann mich gerne ansprechen.
Das Schwierigste dürfte aber überhaupt erst einmal sein, eine Einsatzmöglichkeit zu finden. Aber dazu wird es hier auch noch etwas geben ;-)













Mhm, dass riecht ja schon förmlich nach einem kleinen Plugin dafür, oder?
lol heute ist wohl Wordpress-Tag :)
Offenbar kann man diesen Loop nicht innerhalb des ‘normalen’ Loops einsetzen, oder gibt’s da eine Möglichkeit …?
Hi Leute,
klasse code. Funzt prima! :)
Kann ich bestimmt irgendwann mal gebrauchen… Danke für den Artikel
Hey cool
Kann ich gut gebrauchen