WordPress: get_posts contra the Loop
{8}
Wann immer man sich mit WordPress beschäftigt, selbst wenn man als Laie nicht ins Theme-Design einsteigen will, kommt einem die ominöse Bezeichnung vom “The Loop” zu Ohren. Der folgende Artikel thematisiert übrigens einen technischen Aspekt der WordPress-Theme-Entwicklung. Wobei es sein kann, dass ich naiverweise etwas unterstelle, dem vielleicht gar nicht so ist.
Warum – frage ich mich -, erstellen eigentlich die meisten Leute ihre Themen mit Hilfe von komplexen Konstruktionen, denen allesamt “The Loop” zugrunde liegen muss, wenn es mit dem Template-Tag von WordPress get_posts(); viel einfacher gehen kann? Um zu verstehen, was es damit auf sich hat, möchte ich die Funktionsweise kurz beschreiben. The Loop nennt man gemeinhin drei Zeilen PHP-Code, die so etwas wie den Motor von WordPress starten. Ein Fließband, dass alle Artikel rausrattert, die WordPress zur Verfügung stehen hat. Ein Sisyphos, dieser “The Loop”. Die englische Bezeichnung bedeutet zu Deutsch übrigens “die Schleife”, die Rede ist von etwas immer wiederkehrendem.
Angenommen ich möchte ein WordPress-Thema entwickeln, dass auf der Startseite ein Magazin-Layout abbilden soll. Zunächst entscheidet man sich dafür, verschiedene Kategorien einzurichten, wie Nachrichten, Interviews, etc. pp. Zudem sollen die neusten Artikel unterschiedlich formatiert werden als die älteren Beiträge. Ähnlich einer Tageszeitung soll es einen Top-Artikel als Aufhänger geben und darauf folgend zwei, drei weitere Artikel. Die restlichen Artikel sollen darüber hinaus in Kurzform ausgegeben werden.
Wenn man mit dem WordPress-Motor The Loop arbeitet, muss man verschiedene Bedingungen abfragen und seinen Code immer weiter verzweigen. Das führt zu einem ziemlich großen, unübersichtlichen “The Loop”, der am Ende nur von demjenigen sofort erkannt wird, der ihn konzipiert hat. Der Strom an Artikeln fließt, und wir greifen den ersten Artikel der kommt ab und müssen wie der Arbeiter am Fließband gucken, worum es sich handelt. Wenn es der erste Artikel ist, halten wir the Loop kurz an, schalten quasi in den Leerlauf, behalten aber “Eins” im Sinn. Wir kümmern uns jetzt um die Formatierung die Ausgabe des ersten Blogartikels. Wir müssen allerdings noch abfragen, ob es eine Nachricht, ein Interview oder eine andere Kategorie an Artikel ist. Denn danach soll sich entscheiden, wie der Artikel schlussendlich formatiert wird.
Haben wir das einmal getan, legen wir den Gang wieder ein und The Loop brummt, spuckt den zweiten Artikel aus… – würde uns gerne noch den dritten, vierten und alle Artikel ausspucken, die unser Blog in der Datenbank gespeichert hat. Wir müssen wieder den Gang rausnehmen, noch “Eins” im Sinn haben, und damit schon “Zwei”. So fahren wir fort, bis wir die ersten 4, 5 Artikel nach Wunsch formatiert haben, der Rest soll ja schließlich weniger aufwändig, unter ferner Liefen angezeigt werden.
Hier nun habe ich mich gefragt, ob es nicht einfacher gewesen wäre die Ausgabe mit Hilfe des Template-Tags get_posts(); vorzunehmen. Get_Posts funktioniert selbst wie ein kleiner Motor. Allerdings fängt dieser erst an zu arbeiten, nachdem ich einige Paramter, bzw. Filter eingestellt habe, so dass am Ende nur das ausgespuckt wird, was ich gerne haben möchte. Ich interessiere mich für den allerersten Artikel? Denn dieser soll ja anders formatiert werden als die anderen. Es gibt einen Parameter, bzw. Filter (neben vielen anderen) für get_posts(), der nennt sich $offset. Es handelt sich hierbei um eine Ganzzahl. Zu zählen begonnen wird bei 0. In dem Fall ist 0 der erste (= neueste) Artikel. Diesen können wir nun getrost formatieren. Natürlich dürfen wir nicht vergessen, den Motor zu stoppen, ansonsten würde er uns weitere Artikel ausspucken. Das wollen wir ja nicht.
Mit get_posts(); können wir Artikel von bestimmten Autoren ausgeben lassen, welche zu bestimmten Stichwörtern (Tags), zu bestimmten Kategorien, usf. Wenn ich auf einer Seite 4 Blöcke einrichten wollte, in denen die 4 Hauptkategorien des Blogs ausgegeben werden sollten und je anders formatiert werden sollen, arbeite ich mit get_posts() – oder?
Ich persönlich finde, get_posts(); ist so unheimlich viel flexibler in der Anwendung als der große Motor “The Loop” bei dem ich jeden einzelnen Artikel überprüfen muss, welcher Art er eigentlich ist. Dafür muss ich mindestens 2 Fälle vorsehen. Nämlich den “was wenn Artikel der ist, den ich haben will” und jenen wenn das nicht der Fall ist.
Wenn ich mit “The Loop” arbeite, weiß ich “vorher” nie, was Sache ist. Das weiß ich erst, wenn der Motor die Artikel ausgespuckt, und sie meine Prüfung durchlaufen sind. Das bedeutet aber, dass ich mein Design – die unterschiedliche Formatierung der Artikel, von Variablen abhängig machen muss. Das ist eine Abstraktionsebene, die ich zusätzlich, und wie ich finde unnötigerweise, mit mir rumschleppe. Mit get_posts(); kann ich von Anfang an Klassen und IDs für Container vergeben. Ich muss sie nicht erst “feststellen”. Wohlgemerkt ist das nur eine Unterscheidung an der Oberfläche. Denn das Ergebnis ist hinterher das gleiche. Dennoch finde ich es naiverweise einfacher mit get_posts(); zu gewünschten Ergebnissen zu kommen, als mit dem großen Motor “The Loop”.
Vielleicht gibt’s ja ein paar Stimmen von WordPress-affinen Menschen dort draußen?
Hinzufügen zu del.icio.us, Mr. Wong, LinkARENA, SEOigg
Tags get_posts, The Loop, Wordpress
Kategorie Media · Autor Alexander Trust · 8 Kommentare

January 21, 2009 · 11:07 am
get_posts ist auch ein *Loop* , bloß ein anderer
der jedoch -wäre WP nur darauf aufgebaut-viel weniger Möglichkeiten bieten tät als das große Konstrukt *the loop* so wie er derzeit ist.
es wäre eben die Dauerverwendung eines *kleinen* Loops
lg
January 21, 2009 · 12:42 pm
Joa, auf dem Papier schon. Aber die Voraussetzungen sind ja schon so, wie ich sie skizziert habe, oder?
Also bei The Loop weiß man nicht, was als nächstes kommt und muss es überprüfen. Bei get_posts(); weiß man es genau. Ich finde, das erleichtert die Programmierung ungemein, zumal man auf der Ebene der Inhalte, die man ausgeben will, nicht unnötig viele Bedingungssätze in PHP formulieren muss.
Meiner Meinung nach sollte WP sich von The Loop lösen. Es ist eine äußerst unzufriedenstellende Art, wie man an seine Inhalte kommt. Wie man’s technisch realisiert, davon hab ich kein Ahnung, aber WP könnte ein Layer bieten, in dem man Zugriff auf einzelne oder alle Artikel bietet. Sowas wie ein Array vielleicht. The Loop ist total umständlich und wahrscheinlich auch nur ein Relikt aus alten “Blog”-Zeiten, oder?
January 21, 2009 · 2:57 pm
nein –
wenn man ein CMS für viele macht, bietet man die ganze Palette an Möglichkeiten,
so sehr du zielgenau Loops mit get_posts machen kannst, so sehr bist Du gezwungen zielgenau es zu tun,
aber nicht jeder mag das – somit kann man alles mit dem derzeitigen *Standard Loop* und hat zig Möglichkeiten mehr
es wäre kein wirklicher Fortschritt
lg
January 24, 2009 · 3:14 pm
Entschuldige Monika, wenn ich dir nicht beipflichten kann. Und zwar unter folgender Voraussetzung. Stell dir vor, du könntest mit get_posts() die gleichen Optionen und Filter bedienen wie mit The Loop.
Ich finde es viel komfortabler, in der Programmierung den Weg zu gehen, anzugeben, was ausgegeben werden soll, und wenn es einfach nur heißt: Gib bitte alles aus. Du kannst ja mit get_posts() auch “alle” Artikel ausgeben, erzielst also das gleiche Ergebnis. Du bist im Augenblick nur beschränkt durch die Filter und Optionen.
Bei The Loop muss ich dafür alle Bedingungen abfragen, und blähe mit jedem if nur den Quellcode auf, oder nicht?
January 24, 2009 · 4:04 pm
Hi nein
php Anweisungen blähen keinen Quellcode auf, das macht html schon ganz alleine;)
PHP kannst Du reintippen wie Du lustig bist- das siehst Du doch nie im Quellcode,
also kann es da auch nichts aufblähen
lg
January 24, 2009 · 5:22 pm
Jetzt hängst du dich aber am Wort auf.
Ob aufblähen, oder komplexer sein lassen als nötig, etc. pp. – immerhin ist jede Zeile Code auch wieder mehr KBit, die über die Leitung geschickt werden müssen.
January 24, 2009 · 6:02 pm
Nein Alexander – das was man im Hintergrund – dort wo Du es nicht gleich siehst coden müßte wäre mehr,
außerdem: Herr Schäuble mag alle Mausbewegungen von allen De Internetnutzern aufzeichnen und aufheben – völlig ohne Verdacht, mag IP speichern wieder erlauben – jetzt erlaubt Morgen ein Muss- ganz ehrlichst :bei der derzeitigen Datensammelwut der de Regierung – sind die minibites da sowas von vernachlässigbar — hat sich schon mal wer gefragt was die ganzen Überwachungskameras an Umweltkatastrophen kosten? – die vorherigen Polizisten, die streife gingen waren ein wirklicher Schutz – .. das ist suchen am falschen Platz ALexander – wirklich.
January 27, 2009 · 2:13 pm
Ohne die genauen Hintergründe oder die technische Umsetzung für “The Loop” zu kennen, so weiß ich doch was eine Schleife ist.
So wie es der Artikel darstellt gibt The Loop sämtliche Artikel aus. Das ist und kann irgendwie nicht effizient sein. Wie sieht denn das SQL dafür aus? SELECT * FROM article? Am besten noch mit JOINS über 7 weiteren Tabellen?
Sorry aber eine Schleife war und ist immer noch kein guter Weg eine Schnittstelle zu schaffen für andere Programmierer. Ich hab da was von Klassen und Objekten gehört. Die PHP Welt schien bis Version…4 (bin mir nicht sicher) prima ohne auszukommen. Dementsprechend sieht auch der Code aus.
Selbst sowas wie get_posts() sollte eigentlich als Methode einer Klasse angehören, damit der liebe Alex, wenn er Lust hat, get_posts() so verändern kann wie es ihm beliebt.