<?php
/**
 * Gibt ein Array zurück mit allen Parent Posts ohne Startseite
 *
 * Achtung: Die Funktion ist rekursiv und Pages
 * mit der ID '0' werden nicht ausgewertet
 *
 * @param  string|int  $id         Post-ID
 * @param  int         $max_depth  Optional. Maximale Crawl Tiefe
 *
 * @return array|bool  Die aktuelle Seite & Eltern Seiten als Array
 */
function p_get_breadcrump_posts( $id, $max_depth = 5 ){
	if( $max_depth == 0 ) { return false; };
	$post = get_post( $id );
	$post_data = [];
	if( intval( $post->post_parent ) > 0 ) {
		$post_data = p_get_breadcrump_posts( $post->post_parent, ( $max_depth - 1) );
	}
	$post_data[] = [
		'id'        => $post->ID,
		'title'     => $post->post_title,
		'parent'    => $post->post_parent,
		'permalink' => get_permalink( $post->ID ),
	];

	return $post_data;
};
Rekursive Funktion um alle Parent Elemente zu finden
<?php
/**
 * Gibt ein angepasstes Array aller Parents Posts zurück
 *
 * @param  boolean $include_current Optional. Soll die aktuelle Seite enthalten sein? Default: TRUE
 * @param  boolean $include_home    Optional. Soll die Homepage enthalten sein? Default: TRUE
 * @param  integer $max_depth       Optional. Maxmile Crawling Tiefe Default: 5
 *
 * @see p_get_breadcrump_posts
 *
 * @return array                    array mit den wichtigsten Informationen für eine Breadcrump
 */
function p_breadcrump( $include_current = true, $include_home = true, $max_depth = 5 ){
	global $post;
	$parent_post = get_post( $post->post_parent );

	$breadcrump_posts = ( $include_current ) ? p_get_breadcrump_posts( $post->ID, $max_depth ) : p_get_breadcrump_posts( $parent_post->ID, $max_depth );

	if( $include_home ) {
		$front_page = p_get_breadcrump_posts( get_option( 'page_on_front' ) );
		$front_page = $front_page[0];
		array_unshift( $breadcrump_posts, $front_page );
	};

	return $breadcrump_posts;
};


/* Beispiel Anwendung (1) */
$array = p_breadcrump();

/* Beispiel Ausgabe (1) :
array(4) => [
	'id'    => 0,
	'title' => 'Startseite / Home',
	'parent' => 0,
	'permalink' => 'http://domain.de/',
],[
	'id'    => 993,
	'title' => 'Oberste Seite ohne Parent Seite',
	'parent' => 0,
	'permalink' => 'http://domain.de/uebersicht/',
], [
	'id'    => 820,
	'title' => 'Parent Seite zur Aktuellen Seite',
	'parent' => 993,
	'permalink' => 'http://domain.de/uebersicht/parent',
], [
	'id'    => 760,
	'title' => 'Aktuelle Seite',
	'parent' => 820,
	'permalink' => 'http://domain.de/uebersicht/parent/aktuelle',
]
*/

/* Beispiel Anwendung (2) */
$array = p_breadcrump( false, false );

/* Beispiel Ausgabe (2) :
array(2) => [
	'id'    => 993,
	'title' => 'Oberste Seite ohne Parent Seite',
	'parent' => 0,
	'permalink' => 'http://domain.de/uebersicht/',
], [
	'id'    => 820,
	'title' => 'Parent Seite zur Aktuellen Seite',
	'parent' => 993,
	'permalink' => 'http://domain.de/uebersicht/parent',
]
*/
Greift auf die Funktion aus dem ersten Beispiel zurück, kann aber noch die Startseite hinzufügen
/**
 * Erzeugt ein Breadcrump HTML string
 *
 * @param  boolean $include_current Optional. Soll die aktuelle Seite enthalten sein? Default: TRUE
 * @param  boolean $include_home    Optional. Soll die Homepage enthalten sein? Default: TRUE
 * @param  integer $max_depth       Optional. Maxmile Crawling Tiefe Default: 5
 *
 * @see p_breadcrump
 *
 * @return string                   Ein HTML String
 */
function p_breadcrump_html( $include_current = true, $include_home = true, $max_depth = 5 ){

	$breacrump_data = p_breadcrump( $include_current, $include_home, $max_depth );

	$html = "<ul>";
	foreach ( $breacrump_data as $key => $breadcrump_item ) {
		$html .= "<li><a href=\"" . $breadcrump_item['permalink'] . "\">" . $breadcrump_item['title'] . "</a></li>";
	}
	$html .= "</ul>";
	
	return $html;
};


/* Beispiel Anwendung  */
$html = p_breadcrump_html();

/* Beispiel Ausgabe (1) : */
?>
<ul>
	<li><a href="http://www.domain.de">Startseite</a></li>
	<li><a href="http://www.domain.de/uebersicht">Übersicht</a></li>
	<li><a href="http://www.domain.de/uebersicht/akutelle">Aktuelle
 Seite</a></li>
</ul>
So kann man eine Ausgabe html erzeugen mit den Funktionen aus beiden Beispielen vorher

Breadcrump für WordPress Seiten (Pages)

Breadcrumps für WordPress sind Klassiker – Klassiker sind sie aber leider, weil es keine eigene WordPress Funktion gibt um diese zu generieren. Ich habe hier ein Script geschrieben, mit dem man für Seiten (Pages) ein Breadcrump Array erstellen kann. Dieses funktioniert nicht so wirklich mit Blogbeiträgen (Posts), weil diese im eigentlichen Sinne keine Eltern-Seiten haben, sondern Kategorie basiert sind.

Die wichtigste Funktion ist der Code im ersten Beispiel. Dies ist eine rekursive Funktion (d.h. eine Funktion, welche sich selbst aufruft). Man ruft sie auf, indem man eine Page-ID übergibt. Sie kontrolliert dann ob es eine Partent-Page-ID gibt, welche nicht ‚0‘ ist – Die ID 0 hat nämlich jede Seite ohne Eltern-Seite. Die Funktion gibt dann ein Array zurück, was jeweils die aktuelle und Eltern-Element ID enthält, den Seitentitel und den Permalink dorthin. Der Parameter $max_depth ist dabei nur eine Sicherheit, dass die Funktion nicht unendlich lange sich selbst aufruft, sondern maximal 5 mal.

Die gerade beschriebene Funktion ist der Grundstein für die Funktion, welche im Theme später eigentlich genutzt wird: p_breadcrump(). Mit dieser hat man die Möglichkeit die Ausgabe noch besser zu steuern. So kann eingestellt werden ob die Startseite und die aktuelle Seite Teil der Breadcrump sein sollen oder nicht. Damit bekommt man Strukturen hin wie:

  • Startseite » Übersicht » Aktuelle Seite
  • Startseite » Übersicht
  • Übersicht » Aktuelle Seite
  • Übersicht

Das Dritte Code-Beispiel ist nur dazu da, um zu zeigen, wie man aus dem Array noch eine HTML Ausgabe der Breadcrump im Theme selbst hin bekommt. Das ist eine einfache foreach() Schleife, welche das Array ausliest und sich den Seitentitel und Permalink nimmt um einen UL-Tag zu generieren.