Im Forum von wordpress.de gibt es des öfteren die Frage, wie man denn den letzten, also den neusten Beitrag auf Übersichtsseiten - also Frontpage, Archiv, Kategorieseite - anders stylen kann, um ihn optisch von den älteren abzugrenzen. Dazu gibt es prinzipiell zwei Möglichkeiten. Auf Formatierungen wird hier keine Rücksicht genommen, es soll nur gezeigt werden, wie man den ersten Eintrag explizit ansprechen kann.
Möglichkeit 1: 1, 2, 3...
Die erste Möglichkeit ist das simple Durchzählen, welcher Beitrag gerade in der Loop bearbeitet wird.Dazu wird der Zähler vor der Loop initialisiert, innerhalb der Loop in gleichmäßigen Schritten erhöht und abgefragt.
<?php $counter = 1;
if(have_posts()) : while(have_posts()) : the_post();
if($counter == '1') { ?>
... Hier wird der erste Beitrag formatiert ...
<?php $counter++;
} else { ?>
... Hier werden alle anderen Beiträge formatiert ...
<?php }
endwhile; endif; ?>
Der Zähler hat den Anfangswert 1. Solange dieser Wert noch gespeichert ist, befindet sich die Loop beim ersten Beitrag, der entsprechend den Wünschen formatiert werden kann. Danach wird der Zähler um 1 erhöht, so dass beim nächsten Durchlauf die Bedingung der if-Schleife nicht mehr zutrifft und der else-Teil abgearbeitet wird, also alle anderen Beiträge in der Loop.
Möglichkeit 2: Cut! ...and Action!
Was viele nicht wissen, man kann die Loop ohne weiteres unterbrechen und zu einem späteren Zeitpunkt fortsetzen, man muss nicht alle Beiträge auf einmal abarbeiten. Folgendes Beispiel:
<?php if(have_posts()) : the_post() ?>
... Formatierungen für den ersten Beitrag ...
<?php endif; ?>
<!-- Hier kann noch jede Menge andere Informationen stehen -->
<?php while(have_posts()) : the_post() ?>
... Formatierungen für alle anderen Beiträge ...
<?php endwhile; ?>
Es wird abgefragt, ob Beiträge in der Loop vorhanden sind. Im ersten Durchlauf wird die while-Schleife weg gelassen, es wird nur genau ein Beitrag abgearbeitet - der Erste. Erst zu einem späteren Zeitpunkt werden via der jetzt vorhandenen while-Schleife auch die älteren Beiträge bearbeitet, die Loop befindet sich zu diesem Zeitpunkt beim zweiten Beitrag. Diese Lösung erfordert keine zusätzlichen Abfragen, wo man sich gerade in der Loop befindet, setzt allerdings vorraus, dass mindestens 2 Beiträge in der gewünschten Ansicht vorhanden sind. Ohne würde die while-Schleife eine Fehlermeldung erzeugen.
Schluss
Beide Möglichkeiten unterscheiden sich nicht in ihrer Funktionalität, allerdings ist die erste Variante sicherlich flexibler. Im Beispiel wurde nur darauf eingegangen, wie der erste Beitrag angesprochen werden kann, man könnte aber auch mehrere Beiträge abfragen, jeden zweiten, dritten oder oder oder. Die zweite Methode verzichtet dafür auf eine weitere Variable und eine permanente Abfrage, wo man sich gerade befindet. Sind die Vorraussetzungen gegeben würde ich persönlich dieser Methode den Vorzug geben.
Update 27. September
Beide Möglichkeiten formatieren die entsprechende Seite grundsätzlich so, dass der erste angezeigte Beitrag anders dargestellt wird. Dies ist vielleicht nicht gewünscht, man möchte zum Beispiel, das wirklich nur der zuletzt geschrieben Beitrag anders dargestellt wird. Nehmen wir als Beispiel 10 Beiträge, wobei immer nur 5 pro Seite angezeigt werden sollen. Das würde bedeuten, dass auf der nächsten Seite Beitrag Nr. 6 ebenfalls anders dargestellt werden würde.
Um dieses Verhalten zu unterbinden bedarf es nur einer geringfügigen Änderung:
global $paged
Diese Zeile wird einmal vor die Loop geschrieben. $paged ist eine Variable, in der gespeichert wird, auf welcher Seite wir uns gerade befinden. WordPress weiss darüber, welche Beiträge überhaupt ausgegeben werden sollen. Zurück zu unserem Beispiel: Befinden wir uns auf Seite 2, sollen die Beiträge 6 - 10 ausgegeben werden, und so weiter.
Beim Beispiel des Durchzählens wird die Zeile
if($counter == '1') { ?>
durch
if($counter == '1' && ($paged == '' || $paged < 2)) { ?>
ersetzt. Bei der neuen Bedingungsabfrage, das ist kein "doppelten" sondern 'einfache' Anführungszeichen. Bei der zweiten Möglichkeit wird die Zeile
<?php if(have_posts()) : the_post() ?>
durch
<?php(if(have_posts() && ($paged == '' || $paged < 2)) : the_post() ?>
ersetzt. Auch hier, wieder einfache Anführungszeichen.
Zusammengefasst gesagt wurde die Bedingung der Schleife erweitert. Befinden wir uns auf der ersten Seite, soll der erste Beitrag anders formatiert werden. Ist das nicht der Fall, werden alle Beiträge gleich behandelt. Damit ist sicher gestellt, dass wirklich nur der erste, also zuletzt geschriebene, Beitrag anders formatiert wird.













Also ich habe alternnative 1 bei mir eingesetzt. ich finde die idee, den neusten artikel irgenwie abzuheben sowieso ganz gut.
Ich würde die zweite Variante bevorzugen. Ist weniger Code. :)
Aber schöner Artikel, danke.
Danke für den Tip. Ich werde den gleich mal testen, denn sowas habe ich schon gesucht. Bitte mehr von diesen Tips für Wordpress :)
Eine Frage habe ich noch.
Wie kann man jetzt die darunter folgenden News begrenzen ? Also das nur besispielweise 5 weitere News angezeigt werden ?
Ich benutze derzeit die oben genannte 2. Variante
Das lässt sich in den Optionen von WordPress einstellen: Options -> Reading bzw. Optionen -> Lesen, und dort die Anzahl der Beiträge einstellen.
Habe mit beiden Lösungen in meiner Installation des Brajeshwar 7.0 Themes herumgespielt und damit auch das bekannte Problem (dass auf allen “previous” Seiten immer die selben 5 ersten Beiträge gelistet werden) abgestellt bekommen. Doch stellt sich mir nun eine Folgefrage:
Gibt es auch eine Lösung, wie man die Hervorhebung des jüngsten Beitrags wirklich nur für diesen einen (allerneuesten) realisiert? Beide oben angegebenen Tips führen dazu, dass auch auf allen “previous” Seiten (/2/, /3/, ….) der jeweils oberste Beitrag wieder die hervorgehobene Formatierung des “ersten” Beitrags erhält.
Für einen Tip in dieser Sache wär ich sehr dankbar! :-) Vielen Dank
Hi,
der Artikel ist zwar schon etwas älter, aber Google hat ihn zu Tage gefördert ;)
Ich wollte mich nur kurz bedanken, wirklich hilfreich. Ich hab Möglichkeit 2 umgesetzt.
Hi,
vielen Dank für den Artikel, hat mir sehr weitergeholfen. Ich habe auch dein Update eingesetzt, hier sind mir jedoch zwei Dinge aufgefallen.
Bei mir funktionierte es nur, wenn die Codezeile in der 2. Möglichkeit folgendermaßen abgeändert wurde:
< {Fragezeichen}php if(have_posts() && ($paged == '' || $paged < 2)) : the_post() ?>
Wenn ich global {Dollarzeichen}paged vor den Loop gesetzt habe, wurde es als Text angezeigt, es funktionierte also auch wenn ich es wegließ.
Leider fehlen mir die php Kenntnisse um zu beurteilen woran das liegt.