Für Menschen · Seien Sie begeistert und Sie werden begeistern !
Aktuell habe ich mal wieder an einem Theme gearbeitet und dabei ging es um ein Redesign eines Blog, der aktuell mehr als 1600 Beiträge hat - Sajonara.
Es soll aber nicht um das Design gehen, auch wenn ich sehr zu frieden bin, sondern um einige kleine WordPress Hacks, die ich dort unter anderem für das kommende WordPress Buch integriert und getestet habe. In diesem Zusammenhang werde ich ab und dann einen kleinen Hack vorstellen.
Heute möchte ich zeigen, dass der more-Tag nicht als Dogma zu verstehen ist, sonder sich auch sehr schön im Template beeinflussen lässt. Dabei war das Ziel, dass das Redesign auf der Startseite immer den aktuellen Beitrag komplett darstellt, egal was die Autoren im Backend machen. Dazu muss man den more-Tag deaktivieren bzw. beeinflussen. Dies kann man sehr einfach über die Variable $more, die mit dem Wert 1 dafür sorgt, dass es keinen Link zum Artikel gibt und damit der Artikel komplett ausgegeben wird.
Da es sich um nur einen Beitrag handelt und die Einstellungen des Backend nicht gezogen werden sollen, habe ich einen eigene Loop (new WP_Query) aufgebaut, der lediglich einen Beitrag holt, den Letzten (showposts=1).
have_posts()) : $my_query->the_post();
$do_not_duplicate = $post->ID;
$more = 1;
?>
Im Anschluss setze ich die Variable $do_not_duplicate mit der ID des letzten Beitrags, so dass ich im folgenden Loop diesen Post nicht nochmal auslese.
Der zweite Loop entspricht dann dem bekannten Code und wird lediglich um diese Variable erweitert, siehe nachfolgender Syntax.
ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
Auch im Zusammenspiel mit Conditional Tags kann man den more-Tag gezielt beeinflussen. Ich bin schon des öfteren auf die Mächtigkeit dieser Tags eingegangen und auch hier erweisen sie sich als nützlich.
In folgenden Beispiel wird der more-Tag nicht ausgegeben, wenn man auf der Startseite bzw. Frontpage des Blog ist und der Zähler des Loop nur einen Beitrag hat, ansonsten wird der Artikel mit more-Tag dargestellt.
Die beiden Loop im Zusammenspiel könnten dann zum Beispiel wie folgt aussehen.
have_posts() ) : $my_query->the_post();
$do_not_duplicate = $post->ID;
$more = 1;
?>
<div id="post->?php the_ID(); ?>" class="post">
<h2><a title="><?php the_title(); ?>" rel="bookmark" href="<?php the_permalink(); ?>"></a>
Da Micha es nochmal in den Kommentaren ansprach, hier eine Variante für die Ausgabe von zwei verschiedenen Darstellungen nicht mit zwei Loops, sondern durch einen Zähler $i, der eine Abfrage realisiert, ob es sich um den ersten Beitrag ($i === 1) handelt. Gespart werden damit 2 Queries und die Ausgabe ist die Gleiche, der letzte Post wird komplett dargestellt und die weiteren nur mit der Überschrift. Dabei schalten ich die Funktionsweise des more-Tag ab.
have_posts()) : $my_query->the_post();
$do_not_duplicate = $post->ID;
$more = 1;
?>
<div id="post->?php the_ID(); ?>" class="post">
<h2><a title=">?php the_title(); ?>" rel="bookmark" href="<?php the_permalink() ?>"></a></h2>
<div class="entry"></div>
</div>
<hr />
ID == $do_not_duplicate ) continue; update_post_caches($posts); ?>
<div id="post->?php the_ID(); ?>" class="more-post">
<h2><a title=">?php the_title(); ?>" rel="bookmark" href="<?php the_permalink() ?>"></a></h2>
</div>
<div class="navigation"></div>
Welche Version ihr besser versteht oder einsetzt, dass überlasse ich den Anwendern.
bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.
Das Weblog wird angetrieben von WordPress und aktuell gibt es 980 Beiträge, 18722 Kommentare in 14 Kategorien und 464 Tags.
Das Blog wird liebevoll mit xHTML & CSS in Handarbeit gestaltet. Erstellt mit ♥ zum Befüllen und Erhalten.
Design und Code ist unter Copyright
© 2001 - 2012 bueltge.de [by:ltge.de]
2. Juli 2008 um 14:15
Danke Frank, ich hatte mit meinem aktuellen Theme Probleme mit dem ersten Loop wenn ich mich z.B. auf /page/3/ befand (meine Herangehensweise war ähnlich) ... Ich hab aus deinem Code nur noch die Variablen für den More Tag entfernt und schon hab ich ne sauber Lösung
2. Juli 2008 um 14:35
Ich stecke zwar grad nicht 100%ig in dem $more Ding, aber vom Gefühl her reicht ein Loop auch aus, wenn du vor dem Loop ein Zähler $i =0 und im Loop $i , if ($i===1) { mach irgendwas } verwendest. Da sparst du den kompletten 2. Query.
2. Juli 2008 um 15:07
@Micha: ist richtig, funktioniert. Das setzen ist ja nur für den more-Tag relevant und unabhängig von Loops. Um das Verständnis aber besser an einem Beispiel zu zeigen, habe ich die Variante mit 2 Loop gewählt, wobei ich später nochmal darauf zurück komme.
13. Juli 2008 um 16:58
Darf ich mal was fragen? Diese more-Funktion würde ich gerne eindeutschen, finde aber keinen Hinweis wo und wie. Auch in der PO-Datei ist der Text nicht zu finden...
28. Juli 2008 um 09:02
@Chrisso: Der Text kann beliebig festgelegt werden, dazu muss der Template Tag angepasst werden:
<?php the_content('Den Artikel weiterlesen'); ?>25. August 2008 um 11:13
OT: Ich finde keine Anleitung/plugin zum Thema: "more-tag automatisch setzen". Gibt es da wirklich nichts? Danke.
25. August 2008 um 11:55
@Der Pöbel: Wozu, setze diesen doch einfach per Klick auf den Button. Woher soll ein Plugin wissen, wann der gesetzt werden soll. Dann kannst du im Frontend doch den excerpt nutzten oder den Feed kürzen.
25. August 2008 um 12:28
Das Plugin könnte ja nach 200 Wörtern den more-tag setzen. Ich vergesse _immer_ den more-tag
25. August 2008 um 12:49
@Der Pöbel: Dann würde ich lieber nur den Excerpt ausgeben oder den content gekürzt, dazu gibt es Plugins.
30. August 2008 um 16:28
Hey Frank!
Super Artikel.
Wie bekomme ich es eig. hin das, dass "weiterlesen" nicht direkt hinter dem letzten satz steht sondern das ich es weiter unten einfügen kann?
so das zwischen beitrag und weiterlesen so 10 bis 20 px platz sind.
Also das mit dem css is ja 0 problem aber das weiterlesen kommt ja immer mit dem ..nun weiß ich nicht wie ich das da raus bekomme...
danke!
1. September 2008 um 11:39
@nick: Den Tag kann man via Klasse more-link formatieren.
1. September 2008 um 17:38
Oki...
soweit so gut.
Aber nun möchte ich es gern in einem extra div ablegen.
Ist das auch möglich?
Quasi so wie bei
http://www.engadget.com/mir geht es darum das ich eine extra spalte unter dem artikel habe in der sollte dann der weiterlesen link rein kommen.
sollte also klar abgegrenzt sein.
1. September 2008 um 20:23
@nick: Dazu muss du nicht den more-Tag bemühen, den der Loop kann doch mit HTML erweitert werden so, dass direkt unter dem Tag das div aufhört und angesprochen werden kann, quasi wie auf meiner Startseite.