Da ich immer wieder am optimieren des Blogs bin, besonders jetzt wo er erst seit fast 10 Tagen online ist, habe ich über die letzten Tage noch eine weitere interessante Funktionen zur Darstellung einer mehrschichtigen Breadcrumb aufgebaut. Die Idee hatte ich, als ich zufällig über wplove.de gesurft bin und dort einen Artikel zur Breadcrumb-Navigation ohne Plugin gefunden habe.
Allerdings ist diese Funktion relativ simpel gewesen, und daher habe ich selbst eine Breadcrumb Funktion geschrieben, die sich auch einfach in WordPress einbauen lässt.
Einbauen der Breadcrumb Funktionen:
Die Funktionen am besten in die functions.php des Themes einfügen. Wenn diese nicht vorhanden ist einfach eine functions.php Datei mit folgenden Tags anlegen:
<?php // Funktion hier einfügen... ?>
Die erste Funktion erstellt ein Array mit den einzelnen Breadcrumb Elementen, samt des dazugehörigen Links. Dabei ist es so, dass bei einem einzelnen Artikel, der mehreren Kategorien zugeordnet ist nur die erste Kategorie ausgelesen wird. Ausserdem wird am Ende des Arrays auch die aktuelle Seite, Kategorie oder Artikel mit angezeigt, allerdings nicht mehr verlinkt. Dies kann nach Bedarf in Zeile 12,18 und 28 auskommentiert oder gelöscht werden.
/* Funktionen zur automatisierung einer Breadrcumb 08 Mai 2010, Cornelius Rittner (ggfx.org) */ function ggfx2010_get_breadcrumb() { // erstellt das breadcrumb Array global $post,$cat; $breadcrumb[] = '<a href="'.get_bloginfo('url').'" title="'.get_bloginfo('name').'">'.get_bloginfo('name').'</a>'; if (is_category() && isset($cat)) { $category = get_category_parents($cat, TRUE, '¶'); $category = array_slice(explode("¶",$category),0,-2); $category[] = get_cat_name($cat); $breadcrumb = array_merge($breadcrumb,$category); } elseif (is_single()) { $category = get_the_category(); $category = get_category_parents($category[0]->cat_ID, TRUE, '¶'); $category = array_slice(explode("¶",$category),0,-1); $category[] = get_the_title(); $breadcrumb = array_merge($breadcrumb,$category); } elseif (is_page() && isset($post)) { $ancestors = array_reverse(get_post_ancestors($post)); if (count($ancestors) > 0) { foreach($ancestors as $subpage) { $ancestors_link[] = '<a href="'.get_page_link($subpage).'" title="'.get_the_title($subpage).'">'.get_the_title($subpage).'</a>'; } $ancestors = $ancestors_link; } $ancestors[] = get_the_title(); $breadcrumb = array_merge($breadcrumb,$ancestors); } return $breadcrumb; }
Wenn man das Array hat muss dieses eigentlich nur noch ausgegeben werden, dazu habe ich eine separate Funktion geschrieben die überprüft, ob ich auf den richtigen Seiten (z.B. nicht auf der Startseite) bin und zusätzlich kann eine Zahl als Parameter übergeben werden, der die Breadcrumb nach einer bestimmten Zeichenlänge abschneidet. Da das Abschneiden nur innerhalb des Textes erfolgen darf und nicht im Link oder dergleichen ist die Funktion etwas umfangreicher geraten als zuerst gedacht. Ausserdem habe ich zum Abschneiden des Textes noch eine Zusatzfunktion verwendet:
function ggfx2010_get_shorttext($text,$maxlen,$endstr = '...') { // kürzt Text nach einer bestimmten Zeichenlänge return substr($text,0,$maxlen).$endstr; } function ggfx2010_breadcrumb($maxlen = 0) { // gibt die breadcrumb aus (echo) $breadcrumb = ''; if (is_page() || is_single() || is_category()) { // hole breadcrumb Array $breadcrumb = implode(" ",ggfx2010_get_breadcrumb()); // maxlen gesetzt, also berücksichtigen if ($maxlen > 0 && strlen(strip_tags($breadcrumb)) > $maxlen) { $breadcrumb = ''; foreach(ggfx2010_get_breadcrumb() as $subcat) { $themax = $maxlen - strlen(strip_tags($breadcrumb.' ')); if ($themax > 0) { if (strlen(strip_tags($subcat)) > $themax) { $breadname = ggfx2010_get_shorttext(strip_tags($subcat),$themax); $breadcrumb .= ' '.preg_replace("/(<a[^>]*>)?(.+)(</a>)?/i","$1$breadname$3",$subcat); break; } else { $breadcrumb .= ' '.$subcat; } } } } } if (!empty($breadcrumb)) echo '<div id="breadcrumb">'.$breadcrumb.'</div>'; }
Das waren jetzt die benötigten Funktionen, nun muss die Funktion „ggfx2010_breadcrumb()“ nur noch aufgerufen werden. Dazu platziert man den Aufruf am besten in den diversen Seiten index.php, single.php, page.php, archive.php oder category.php. Alternativ kann der Aufruf vielleicht auch in der header.php eingefügt werden:
<?php // mit Zeichenbegrenzung ggfx2010_breadcrumb(62); ?> <?php // ohne Zeichenbegrenzung ggfx2010_breadcrumb(); ?>
Das Breadcrumb Array das mit „ggfx2010_get_breadcrumb()“ erzeugt wird kann übrigens auch im Title Tag gut genutzt werden! Mit array_reverse() lässt sich das Array dann auch einfach umdrehen etc. Dies ist im Hinblick auf SEO natürlich optimal. Dafür wird dann aber eine eigene Funktion notwendig sein, … demnächst hier ;)