Je recherchais une méthode rapide et délicate pour générer une navigation dans le fil d'Ariane sur un site WP, sans nécessiter l'installation d'un plug-in ni l'utilisation du menu intégré WP.
Voici ce que je suis venu avec. Je suis curieux de savoir s'il me manque une meilleure solution et/ou s'il y a quelque chose qui ne va pas du tout de cette façon. Jusqu'à présent, dans mes tests, cela fonctionne assez bien.
class BreadcrumbWalker extends Walker_Nav_Menu {
private $i_current_page_id;
private $i_depth;
private $a_output;
function __construct() {
// sets our current page so we know when to exit
$this->i_current_page_id = get_queried_object()->ID;
}
function start_lvl(&$output, $depth=0, $args=array()) {
// increment the depth every time a new ul is entered
$this->i_depth++;
}
function end_lvl(&$output, $depth=0, $args=array()) {
// decrement the depth when we exit a ul
$this->i_depth--;
}
function start_el(&$output, $item, $depth=0, $args=array()) {
// if this value is zero, we're starting a new branch
if($item->menu_item_parent == 0) {
// reset the output array and depth counters
$this->a_output = array();
$this->i_depth = 0;
}
// if we haven't set the representative menu item for this depth, do so
if(!isset($this->a_output[$this->i_depth])) {
$this->a_output[$this->i_depth] = '<a href="' . get_permalink($item->object_id) . '">' . $item->title . '</a>';
}
}
function end_el(&$output, $item, $depth=0, $args=array()) {
if($this->i_current_page_id == $item->object_id) {
// check to see if this is our last item, if so display the breadcrumb
if($this->i_depth > 0) {
// but only show it if we actually have a breadcrumb trail
$this->display_breadcrumb();
}
} else {
// if not, unset the item for this depth since this isn't what we're going to display
unset($this->a_output[$this->i_depth]);
}
}
function display_breadcrumb() {
// implode our array into a string
echo implode(' » ', $this->a_output);
}
}
Ce que je fais consiste essentiellement à utiliser les méthodes Walker_Nav_Menu pour définir un tableau de sortie utilisant la profondeur comme clé. Une fois la méthode end_el appelée, si ce n'est pas l'ID de la page qui est la fin du fil d'Ariane, elle désactive le élément à cette profondeur et continue à parcourir le tableau. Si est le bon identifiant, il appelle la méthode display_breadcrumb pour afficher le menu.
Merci d'avance pour toute contribution. Je pense qu'il y a probablement une meilleure façon de faire cela, mais pour le moment, je suis perplexe sur ce que cela pourrait être.
À votre santé.
Je ne pouvais pas croire qu’il n’y ait pas un seul plugin GRATUIT disponible pour cela. Alors j'ai écrit ma propre fonction. Voici. Copiez simplement ceci dans votre functions.php:
function my_breadcrumb($theme_location = 'main', $separator = ' > ') {
$items = wp_get_nav_menu_items($theme_location);
_wp_menu_item_classes_by_context( $items ); // Set up the class variables, including current-classes
$crumbs = array();
foreach($items as $item) {
if ($item->current_item_ancestor || $item->current) {
$crumbs[] = "<a href=\"{$item->url}\" title=\"{$item->title}\">{$item->title}</a>";
}
}
echo implode($separator, $crumbs);
}
Ensuite, n'importe où dans votre thème, vous pouvez afficher le fil d'Ariane comme ceci:
<?php my_breadcrumb('menu-slug'); ?>
Ce code peut facilement être étendu, en omettant le paramètre $ theme_location et en obtenant une liste de tous les menus disponibles, en ne produisant le résultat que si le tableau $ crumbs n'est pas vide. Je peux écrire un article sur ce blog ou le transformer bientôt en plugin gratuit. Te tenir au courant.
Vous pouvez également ajouter une classe ou un autre balisage à l’élément actuel en vérifiant $ item-> current.
J'ai écrit un plugin qui ne fait que ça!
Vous pouvez le trouver à: http://codecanyon.net/item/wp-nav-menu-breadcrumbs/4706192
Voici la classe de marcheur que je développe pour zurb foundation 5 élément de fil d'Ariane, utile si vous souhaitez afficher votre fil d'Ariane dans une balise de liste non ordonnée.
class BreadCrumbWalker extends Walker_Nav_Menu
{
function start_lvl( &$output, $depth = 0, $args = array() )
{
}
function end_lvl( &$output, $depth = 0, $args = array() )
{
}
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;
$title = apply_filters( 'the_title', $item->title, $item->ID );
if( in_array('current-menu-item', $classes) OR in_array( 'current-menu-parent', $classes ) ){
//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
if( in_array('current-menu-item', $classes) ){
$output .= '<li>'.$title.'</li>';
}else{
$output .= '<li><a' . $attributes . '>' . $title . '</a></li>';
}
}//if current
}//start_el
}
Pourquoi ne pas faire quelque chose de semblable à ceci;
function the_breadcrumb() {
if (!is_home()) {
echo '<a href="';
echo get_option('home');
echo '">';
bloginfo('name');
echo "</a> » ";
if (is_category() || is_single()) {
the_category('title_li=');
if (is_single()) {
echo " » ";
the_title();
}
} elseif (is_page()) {
echo the_title();
}
}
}
Ensuite, où que vous soyez, utilisez-les simplement;
<?php the_breadcrumb(); ?>