Покажите текущий путь навигации из меню

Я хочу что-то вроде этого

Домой> продукты> Сталь> Гвозди

Эта информация должна прибыть из структуры меню! Я установил Навигационную цепочку NavXT, но кажется, что это только берет путь, который я определил (это - родитель и так далее). Но мне нужно это от структуры меню не от пользователя. Я должен установить родительскую страницу для каждой страницы или есть ли решение, которое считывает иерархию из моего меню? Я не сделал нашел кипящую Навигационную цепочку NavXT, и кажется, что я должен записать Сценарий PHP для этого.

Править: Для моего развивать вопрос я добавил следующий код:

if(in_array('current-menu-item', $item->classes)){
    $attributes .= ' class="active"';
}
5
23.01.2020, 12:56
1 ответ

Лучший способ состоял бы в том, чтобы использовать wp_nav_menu с пользовательским Уокером.

Предпосылки:

Useage

Везде, где Вы хотите навигационные цепочки (для 'основного' местоположения темы):

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

Пользовательский Уокер

Это является очень простым. (Это могло быть сделано иначе - переопределение display_element вместо этого? - но я нашел это самым простым). Это должно жить в Вашем 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>';
        }
    }
}
5
19.02.2020, 22:08
  • 1
    Спасибо за Вашу потрясающую работу. Действительно ли возможно добавить обертку для последнего элемента? Я хочу изменить моделирование. Что-то как a <span class="active"> обертка была бы хороша. И я думаю, что не могу избавиться от ул., переносятся или? –  testing 30.04.2012, 17:17
  • 2
    Пример, который я даю, не переносит его в ul теги. Это переносит его в <div id="breadcrumb-%1$s" class="%2$s">%3$s</div>. Для изменения разметки для последнего элемента только проверяют если current-menu-item находится в $item->classes массив и стиль соответственно. –  Stephen Harris 30.04.2012, 17:23
  • 3
    Спасибо за Ваш быстрый ответ! Вы правы. Я удалил тот код и как принимают значение по умолчанию ul был взят. Я также добавил код к Вашему сценарию. Теперь это работает как ожидалось! Еще раз спасибо! –  testing 30.04.2012, 17:41

Теги

Похожие вопросы