Un fil d’ariane en fonction du menu personnalisé ? Pourquoi ?

Il est parfois nécessaire de construire un fil d’ariane avec wordpress. Il existe de très bon plugins déjà tout fait. Malheureusement, ceux-ci affichent le fil d’ariane en fonction de l’arboresence des pages WordPress; Or parfois nous avons besoin d’avoir un breadcrumb relatif à notre menu personnalisé.

Comment fait-on alors ?

Nous allons passer par un fonction de WordPress bien connu : wp_nav_menu() à laquelle nous allons indiquer un Walker.

Le code du Walker :

Voici le code du Walker. Écrivez celui-ci dans le fichier functions.php de votre thème ou bien alors, si vous avez suivi mes bonnes pratiques, créez un fichier à part que vous inclurer dans votre fichier functions.php.

class bi_BreadCrumbWalker extends Walker{

    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>';

			// added by me to remove the link on the current page item
			if ( in_array("current-menu-item", $classes) ) {
				$output .= '<span class="current-page">'.$title.'</span>';
			} else {
				$output .= '<a'. $attributes .'>'.$title.'</a>';
			}

        }
    }
}

Appel du fil d’ariane dans les fichiers templates

Pour afficher le fil d’ariane, insérez le code ci-dessous où vous le souhaitez dans votre thème :

<?php wp_nav_menu( array(
                      'theme_location' => 'Menu',
                      'walker'=> new bi_BreadCrumbWalker,
                      'container' => none,
                      'items_wrap' => '%3$s'
                ));
                ?>

Source : http://wordpress.stackexchange.com/questions/50425/show-current-navigation-path-from-menu

Classé dans la catégorie : PHP, Wordpress