Für Menschen · Seien Sie begeistert und Sie werden begeistern !
Nicht selten werden die Menus auf Blogs, welche mit WordPress arbeiten, mit statischen Links erstellt. Das mag anfangs einfacher erscheinen und weniger Mühe machen, aber bei Veränderungen oder Pflege durch User, die keine Kenntnis oder Zugriffe auf die Templates haben, ist es aufwändig, fehleranfällig und umständlich. Daher bietet es sich an, lieber die nötigen Template Tags zu nutzen und mit Hilfe der Parameter die nicht erwünschte (exclude) oder erwünschten (include) Seiten zu laden. Zusätzlich kann man Inhalte hinzufügen via Hook, was ich hier mal kurz erklären will.
So wie sehr viele Funktionen von WordPress, so lässt auch wp_list_pages() den Eingriff per Filter Hook zu. Die Funktion selbst hat eine ausführliche Beschreibung im Codex.
$output = apply_filters('wp_list_pages', $output);
Diesen machen wir uns zunutze und erweitern den Inhalt um zwei Beispiellinks, die man sonst im Theme händisch ergänzen müsste. Dazu legen wir den folgenden Code-Schnipsel in die functions.php des Themes. Die Tags müssen mit übergeben werden, da der Hook nach der Ausgabe der Liste integriert ist.
if ( !function_exists('fb_add_page_link') ) {
function fb_add_page_link($output) {
$output .= '<li><a href="http://example.com/1/">Example 1</a></li>';
$output .= '<li><a href="http://example.com/2/"><span>Example</span> 2</a></li>';
return $output;
}
add_filter('wp_list_pages', 'fb_add_page_link');
}
Nun wird die Ausgabe erweitert um die beiden Beispiellinks. Der folgenden HTML-Syntax soll es verdeutlichen.
<li class="pagenav">
<h3>Seiten</h3>
<ul>
<li class="page_item page-item-2"><a href="http://example.com/?page_id=2" title="About">About</a></li>
<li class="page_item page-item-64"><a href="http://example.com/?page_id=64" title="Default Form">Default Form</a></li>
<li class="page_item page-item-40"><a href="http://example.com/?page_id=40" title="Offerings">Offerings</a></li>
<li class="page_item page-item-12"><a href="http://example.com/?page_id=12" title="Page 2">Page 2</a>
<ul>
<li class="page_item page-item-14"><a href="http://example.com/?page_id=14" title="Subpage">Subpage</a>
<ul>
<li class="page_item page-item-45"><a href="http://example.com/?page_id=45" title="Subsubpage">Subsubpage</a></li>
</ul>
</li>
</ul>
</li>
<li class="page_item page-item-16"><a href="http://example.com/?page_id=16" title="Page 3">Page 3</a></li>
</ul>
</li>
<li><a href="http://example.com/1/">Example 1</a></li>
<li><a href="http://example.com/2/"><span>Example</span> 2</a></li>
Aufpassen, diese Links werden nach Prüfen der Parameter hinzugefügt und sind damit nicht mehr mit Hilfe der Parameter zu entfernen. Setzt man den Template Tag wp_list_pages() also mehrfach mit unterschiedlicher Ausgabe ein, so ist bei allen Ausgaben die Erweiterung dabei. Unterschiede lassen sich dann nicht ohne weiteres gestalten. Auch nicht mit dem zweiten Template Tag für Pages wp_page_menu(). Dieser Template Tag zieht die Inhalte aus aus der Funktion wp_list_pages()!
Als Hinweis sei noch gesagt, dass man den Template Tag wp_page_menu() erst seit WordPress Version 2.7 einsetzen kann. Dieser Tag kann im Grunde nicht viel mehr außer das automatische Hinzufügen eines Home-Link und die Steuerung der Ausgabe (echo), mehr in Beschreibung oder bei Monikas Artikel. Aber die Funktion unterscheidet sich noch in zwei weiteren Fällen und so kann man an zwei Punkten via Filter Hook einhaken und modifizieren.
Zum einen kann man die Argumente erweitern ...
$args = apply_filters( 'wp_page_menu_args', $args );
... und zum anderen das Menu erweitern.
$menu = apply_filters( 'wp_page_menu', $menu, $args );
Und damit kann man doch wieder unterschiedliche Ausgaben realisieren. So ruft der folgende Syntax wieder die beiden Beispiellinks in die zu letzt genannte Funktion wp_page_menu() und damit kommt wp_list_pages() ohne die Erweiterung der beiden Links aus.
add_filter('wp_page_menu', 'fb_add_page_link');
Mit ein wenig Überlegung kann man so also recht flexibel die Ausgabe gestallten und die Autoren mitwirken lassen, wenn es darum geht, automatisch Seiten zu Navigationen hinzuzufügen.
Die Idee ist aufgefallen bei Sivel.net
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]
3. März 2009 um 13:06
Verrückt! Gerade eben habe ich rumprobiert wie ich einen Link zum RSS Feed und dem Feedburner Mailabo in die Nav reinbekomme. Hatte zwar schon eine Lösung über einen Theme-eigenen Template Tag (Hybrid), aber deine Lösung ist besser, weil ich ohne zusätzliches CSS auskomme. Und noch verrückter, würde ich Twitter krasser nutzen, wäre ich in diesem Falle schneller gewesen. Danke.
3. März 2009 um 13:12
Ich benutze hierfür mein Redirector Plugin.
Ich leg einfach eine leere Seite an im Menü und gib als Spezialfeld die Adresse an.
http://wordpress.org/extend/plugins/redirector/3. März 2009 um 14:15
@Ralf: auch eine Idee, die dann aber einen Eintrag in der Datenbank erfordert. Im Grunde aber sehr gut für Autoren etc., die diese Möglichkeit benötigen und nicht in den Code wollen. Außerdem hat deine Möglichkeit natürlich den Vorteil, dass man dann wieder im Template Tag per Parameter filtern kann.
3. März 2009 um 14:59
Ich bin jetzt mal ketzerisch:
Wenn er das eine nicht kann, wird er sicherlich mit deiner Funktion auch nicht mehr anfangen können
3. März 2009 um 15:41
@Micha: nein, kann er nicht. Dazu dient de Lösung von Ralf. Mit meiner kleinen Funktion wird aber aus meiner Sicht das Markup kleiner für die Theme-Entwickler.
3. März 2009 um 16:06
Super Danke so was hatte ich schon länger gesucht, was mich noch intressieren würde eine Art Plugin wo man Seiten einbauen kann die aber nur als Link dienen, um so zum Beispiel Externe Seiten noch in der Navigation zu Verlinken oder für Portfolios oder so was in der Art, damit man dann auch die Anordnung der Seiten dann Anpassen kann.
3. März 2009 um 16:21
@Nico: schau den Kommentar von Ralf an, er gibt dazu eine Lösung.
4. März 2009 um 09:22
Das stimmt allerding Frank, aber zum Glück ist es nur ein Postmeta Eintrag. Ich bin ein riesen Fan davon nur die WP Tabellen zu benutzen, da man hierdurch die wirklich durchdachte WordPress API benutzen kann.
Ich muss endlich mal dazu kommen Sprachdateien anzubieten. Jedoch bekomm ich PoEdit nicht richtig konfiguriert. Hab das Tutorial von WP-Deutschland verfolgt aber bekomms leider doch nicht hin.
4. März 2009 um 09:48
@Ralf: ich mache alles mit CodeStyling Localization, was mir mehr Möglichkeiten gibt und sauberer arbeitet.
4. März 2009 um 09:58
Das sieht mal sehr interessant aus, werde ich heut abend mal antesten. Danke für den Tipp Frank!
5. März 2009 um 11:48
Das ist ein ganz wunderbares Plugin und exakt das, was ich gesucht habe, um Kategorien als Menüpunkte in einem CMS-Wordpress zu fixieren ohne in der wp_list_pages herumzufrickeln. Vielen Dank!
3. Dezember 2009 um 23:33
hallo, ich habe eine propleme an daur kommt bei mir span e mail vie kann ich mich schützen gibs es eine lösung ? danke Aydin
4. Dezember 2009 um 11:44
@Aydin: es gibt viele Lösungen, dazu muss man weiter ausholen. Die einfachste Lösung ist sicher ein Plugin, wovon es viele unterschiedliche Ansätze und Umsetzungen gibt. Google spuckt sehr viel aus, hier im Blog gibt es auch einige Tipps und ebenso im Plugin-Verzeichnis von WP.