Archives for April 2007

WordPress anpassen – Navigation

Umso mehr ich mich mit WordPress beschäftige, desto besser gefällt es mir. Ich habe gestern angefangen die Navigation etwas umzubauen. Oben habe ich das topmenu mit „Startseite“, „Florian“ und „Impressum“. Ich will jedoch nur die erste Ebene der Navigation angezeigt haben. Die „Startseite“ ist jedoch keine Page, also musste ich ein wenig tricksen.


<div id="topmenu">
<ul>
<li class="page_item<?php if ( is_home() ) { ?> current_page_item<?php } ?>"><a href="/">Startseite</a></li>
<?php wp_list_pages('depth=1&title_li=' ); ?>
</ul>
</div>

Mit der Funktion is_home() kann ich überprüfen, ob sich der Besucher auf der Startseite befindet. Wenn das der Fall ist, wird automatisch die Klasse „current_page_item“ hinzugefügt. Dadurch habe ich nun das topmenu mit der Startseite und alle Pages der ersten Eben. Mit dem Parameter „depth=1“ wird nur die erste Ebene geladen. Mit dem Parameter „title_li“ kann meine eine Überschrift definieren. Ich habe diesen Wert leer gelassen.

Etwas komplizierter war dann aber das submenu. Dieses soll nur auftauchen, wenn die aktuelle Seite eine Page ist (is_page()) und es weitere Seiten dazu gibt. Zudem sollen nur die Unterpunkte angezeigt werden. Ersters ist mit der Funktion is_page() kein Problem. Aber zweiteres ist schon etwas schwieriger.

Unterhalb der Page Florian gibt es noch Sandra und Presse. Unterhalb von Presse gibt es zudem nochmal zwei weitere Pages. Wenn jetzt eine dieser Seiten augerufen wird, muß also die Navigation unterhalb von Florian (1. Ebene) angezeigt werden. Also muß ich zuerst die ID der Page der obersten Ebene herausfinden. Jede Page hat eine ID und auch einen post_parent. Bei Pages der ersten Ebene ist der Wert von post_parent=0. Also brauche ich eine Schleife die mir solange die ID des Parent zurückgibt, bis post_parent den Wert 0 hat. Dann habe ich die ID der obersten Seite.

$top_post = $post;
while ($top_post->post_parent <> 0) {
$top_post = get_post($top_post->post_parent);
}

Die aktuelle Page (und auch Weblog-Eintrag) wird im Objekt $post gespeichert. Ich erzeuge mir nun mein eigenes Objekt $top_post als Kopie von $post. Schließlich könnte die aktuelle Page bereits zur ersten Ebene gehören.

Die While-Schleife wird solange ausgeführt, bis die Page keinen Parent-Eintrag mehr hat.

Jetzt muß ich noch überprüfen, ob es überhaupt Pages unterhalb gibt. Dazu verwende ich wieder die Funktion wp_list_pages.

if (wp_list_pages('child_of=' . $top_post->ID . '&title_li=&echo=0' ) <> "")

mit echo=0 wird das Ergebnis nicht ausgegeben, sondern zurückgegeben. Dadurch kann ich mit einer einfachen if-Abfrage überprüfen, ob es weitere Pages gibt. Durch den Parametern child_of werden nur Pages ausgegeben, die unterhalb meiner top_page zu finden sind.

Das ganze sieht dann so aus:

<?php
if (is_page()) {
$top_post = $post;
while ($top_post->post_parent <> 0) {
$top_post = get_post($top_post->post_parent);
}
if (wp_list_pages('child_of=' . $top_post->ID . '&title_li=&echo=0' ) <> "") {
?>
<li><h2><?php echo $top_post->post_title; ?></h2>
<ul>
<?php
wp_list_pages('sort_column=menu_order&child_of=' . $top_post->ID . '&title_li=' ); ?>
</ul>
</li>
<?php
} /* Gibt es Pages? */
} /* Ist es eine Page? */
?>

This is a demo store for testing purposes — no orders shall be fulfilled.