Besseres Menü für BlogTheme

Während ich für WeizenSpr.eu (bisher) beim einfachen Kubrick-Theme geblieben bin und es ein wenig erweitert habe, um ihm einen persönlichen Touch zu verleihen, wollte ich bei meinem neuen Projekt, dass das ganze ein bisschen seriöser aussieht.

Nach einer langen Suche bin ich dann schlussendlich beim BlogTheme hängen geblieben. Wie ich jedoch leider feststellen musste, ist es nur dafür ausgelegt, dass die Hauptseite automatisch auch die Blogbeiträge enthält. Deutlich wird dies bei der Verwendung des Blogmenüs, das es mir inzwischen sehr angetan hat.
Dieses reagiert nur so lange zufriedenstellend, wie man über die Einträge ausschließlich einzelne Seiten verfügbar machen will. Sobald auf einem Link der Blog liegt oder eine Seite Unterseiten besitzt, wirkt die Darstellung ziemlich willkürlich.
Diesem Probleme habe ich mich angenommen und wollte nun einmal zeigen, wie man das Menü ein wenig verbessern kann.

Zuständig dafür, herauszufinden, welche Einträge in das Menü kommen, ist die Funktion "woothemes_get_pages()" in der Datei "./functions/getpages.php"

Das erste Problem, das das Menü hat, ist, dass Unterseiten im Menü auftauchen: Angenommen, man hat die Seite "Projekte", der man für jedes Projekt eine Unterseite hinzufügt. Im Menü selber sollten natürlich nicht alle Unterseiten auftauchen.
Es gibt zwar die Möglichkeit, durch die Angabe der Seiten-ID in der BlogTheme-Konfiguration diesen Seiten aus dem Menü zu entfernen, jedoch erschien mir dieses Vorgehen ziemlich aufwändig.
Aus diesem Grund habe ich einfach den Aufruf verändert, der für das Einlesen aller Seiten-IDs zuständig ist.

1
2
3
$getcats = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE
                               $wpdb->posts.post_type = 'page' AND
                               $wpdb->posts.post_status = 'publish'"
);

Glücklicherweise enthält jede Unterseite einen Verweis auf die ID seiner Elternseite. Sobald diese ID ungleich null ist, handelt es sich automatisch um eine Unterseite. Diesen Fakt können wir in dem Aufruf nutzen, um die ungewollten Seiten einfach herauszufiltern.
Nebenbei können wir gleich dafür sorgen, dass die Seiten eine vorhersehbare Reihenfolge haben, indem wir sie anhand ihrer ID sortieren lassen - dadurch steht die Seite, die zuerst erstellt wurde auch an vorderster Stelle im Menü.

1
2
3
4
5
$getcats = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE
                               $wpdb->posts.post_type = 'page' AND
                               $wpdb->posts.post_parent = 0 AND
                               $wpdb->posts.post_status = 'publish'
                               ORDER BY $wpdb->posts.ID ASC"
);

Für die weiteren Schritte benötigen wir ein paar Informationen von der aktuell angezeigten WordPress-Seite. Es gibt zwar einige Ansätze, Dinge wie die aktuelle URL aus den HTTP-Headern auszulesen, aber wieso sollte man das machen, wenn einem WordPress schon die ganze Arbeit abnimmt?
Danke der Information auf WenderHost.com konnte ich deshalb diesen wirklich kurzen Quelltext auf die Beine stellen, um die ID der aktuellen Seite und die Parent-ID der aktuellen Seite auszulesen:

1
2
3
$post_obj = $wp_query->get_queried_object();
$post_ID = $post_obj->ID;
$post_parent = $post_obj->post_parent;

Diesen Codeblock fügt man am besten direkt hinter der SQL-Abfrage ein. Dort wird er nur ein einziges Mal aufgerufen, was für den weiteren Verlauf völlig ausreichend ist.

In der folgenden Schleife findet sich der Befehl, der darüber entscheidet, ob der Menüeintrag, der gerade erzeugt wird, als aktiviert oder als deaktiviert dargestellt werden soll:

1
2
3
4
5
if ( is_page($thecat->ID) ) {
  $current = 'class="current_page_item"';
} else {
  $current = '';
}

Diesen kurzen Quelltext ersetzen wir nun durch diese nur unwesentlich längere Variante 😉 :

1
2
3
4
5
6
7
$current = '';
if ( ( $post_ID == $thecat->ID ) ||
     ( $post_parent == $thecat->ID ) ||
     ( ( is_single() || is_archive() ) &&
       ( get_option("page_for_posts") == $thecat->ID ) ) ) {
  $current = 'class="current_page_item"';
}

Im Grunde besteht diese Abfrage aus 3 Bedingungen. Eine der drei muss erfüllt sein, damit der aktuell erzeugte Menüeintrag als aktiv dargestellt wird:

  • Die erste Bedingung ist ein Ersatz für die vorher verwendete: Es wird also nur geguckt, ob der Menüeintrag zu der Seite gehört, die gerade angezeigt wird. Falls ja, muss der Menüeintrag natürlich aktiviert sein 😉 .
  • Die zweite Bedingung ist da, um zu überprüfen, ob die aktuell angezeigte Seite eine Unterseite der Seite ist, die ins Menü eingetragen werden soll. Dies funktioniert bisher nur mit der ersten Unterebene - sollte für den Anfang jedoch erstmal reichen 😉 .
  • Die dritte Bedingung ist dann schlussendlich für solche Blogs, bei denen sich die Blogeinträge auf einer Unterseite (z.B. "News") befinden. Ist man in einem Archiv oder sieht man sich einen Blogeintrag an, wird der Menüpunkt, der den Artikelindex repräsentiert, aktiviert.

Ich hoffe, die Beschreibung war so verständlich, dass andere Blogger die Modifikationen zur Not selber umsetzen könnten 😀 !

Und nicht vergessen: Ich hafte nicht für Schäden an Software, Hardware oder für Vermögensschäden, die durch Anwendung dieser Änderungen entstanden sind oder entstehen könnten. 😉
Bessere Grüße, Kenny

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.