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