The best way would be to use wp_nav_menu
with a custom walker.
Prerequisites:
Useage
Wherever you want the breadcrumbs (for theme location 'primary'):
<?php wp_nav_menu( array(
'container' => 'none',
'theme_location' => 'primary',
'walker'=> new SH_BreadCrumbWalker,
'items_wrap' => '<div id="breadcrumb-%1$s" class="%2$s">%3$s</div>'
) ); ?>
The custom walker
This is very basic. (This could be done another way -override display_element
instead? - but I found this the most straightforward). This should live in your functions.php
class SH_BreadCrumbWalker extends Walker{
/**
* @see Walker::$tree_type
* @var string
*/
var $tree_type = array( 'post_type', 'taxonomy', 'custom' );
/**
* @see Walker::$db_fields
* @var array
*/
var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' );
/**
* delimiter for crumbs
* @var string
*/
var $delimiter = ' > ';
/**
* @see Walker::start_el()
*
* @param string $output Passed by reference. Used to append additional content.
* @param object $item Menu item data object.
* @param int $depth Depth of menu item.
* @param int $current_page Menu item ID.
* @param object $args
*/
function start_el(&$output, $item, $depth, $args) {
//Check if menu item is an ancestor of the current page
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$current_identifiers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' );
$ancestor_of_current = array_intersect( $current_identifiers, $classes );
if( $ancestor_of_current ){
$title = apply_filters( 'the_title', $item->title, $item->ID );
//Preceed with delimter for all but the first item.
if( 0 != $depth )
$output .= $this->delimiter;
//Link tag attributes
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
//Add to the HTML output
$output .= '<a'. $attributes .'>'.$title.'</a>';
}
}
}
Products > Steel > Nails
. Some of the pages have a hierarchy. Here it looks likeSteel > Big > Nails
. So the hierarchy differs a little bit. But I want the hierarchy from the menu. I know one way to achive that would be setting the hierarchy for each page. But I don't know if the user would do that if he creates a new page ...