Описание пунктов меню? Пользовательский Walker для wp_nav_menu ()

Нормальное WordPress меню выглядит так:

Home | Blog | About us | Contact

Но я видел много сайтов, где меню с описанием:

Home Page | Our Blogs | About us
| Contact
….meet us…| read more| basic info| contact form

Как этого добиться?

(Я хочу, чтобы это было основной функцией для всех моих тем, поэтому не нужно плагинов, я просто хочу знать, как это делается)

Понравился вопрос? Нужен ответ? Поддержите проект
WPAsk
Ответов: 3
  1. fuxia

    Вам нужен пользовательский Walker для меню навигации.

    По сути, вы добавляете параметр 'walker' в wp_nav_menu() и вызваете экземпляр расширенного класса:

    wp_nav_menu(
        array (
            'menu'            => 'main-menu',
            'container'       => FALSE,
            'container_id'    => FALSE,
            'menu_class'      => '',
            'menu_id'         => FALSE,
            'depth'           => 1,
            'walker'          => new Description_Walker
        )
    );
    

    Класс Description_Walker расширяет Walker_Nav_Menu и изменяет функцию start_el( &$output, $item, $depth, $args ).

    Пример:

    
    class Description_Walker extends Walker_Nav_Menu
    {
     
        function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 )
        {
            $classes     = empty ( $item->classes ) ? array () : (array) $item->classes;
    
            $class_names = join(
                ' '
            ,   apply_filters(
                    'nav_menu_css_class'
                ,   array_filter( $classes ), $item
                )
            );
    
            ! empty ( $class_names )
                and $class_names = ' class="'. esc_attr( $class_names ) . '"';
    
            $output .= "<li id='menu-item-$item->ID' $class_names>";
    
            $attributes  = '';
    
            ! empty( $item->attr_title )
                and $attributes .= ' title="'  . esc_attr( $item->attr_title ) .'"';
            ! empty( $item->target )
                and $attributes .= ' target="' . esc_attr( $item->target     ) .'"';
            ! empty( $item->xfn )
                and $attributes .= ' rel="'    . esc_attr( $item->xfn        ) .'"';
            ! empty( $item->url )
                and $attributes .= ' href="'   . esc_attr( $item->url        ) .'"';
    
            // вставить описание только для элементов верхнего уровня
            $description = ( ! empty ( $item->description ) and 0 == $depth )
                ? '<small class="nav_desc">' . esc_attr( $item->description ) . '</small>' : '';
    
            $title = apply_filters( 'the_title', $item->title, $item->ID );
    
            $item_output = $args->before
                . "<a $attributes>"
                . $args->link_before
                . $title
                . '</a> '
                . $args->link_after
                . $description
                . $args->after;
    
            // Поскольку $output вызывается по ссылке, нам не нужно ничего возвращать.
            $output .= apply_filters(
                'walker_nav_menu_start_el'
            ,   $item_output
            ,   $item
            ,   $depth
            ,   $args
            );
        }
    }
    

    В итоге:

    enter image description here

    1. nevvermind

      Попробуйте это: public function start_el(&$output, $item, $depth, $args) { parent::start_el($output, $item, $depth, $args); $output .= sprintf('<i>%s</i>', esc_html($item->description)); }

  2. Joost

    Вот пример:

    function add_description_to_menu($item_output, $item, $depth, $args) {
        if (strlen($item->description) > 0 ) {
         
            $item_output .= sprintf('<span class="description">%s</span>', esc_html($item->description));
    
         
            //$item_output = substr($item_output, 0, -strlen("</a>{$args->after}")) . sprintf('<span class="description">%s</span >', esc_html($item->description)) . "</a>{$args->after}";
        }
    
        return $item_output;
    }
    add_filter('walker_nav_menu_start_el', 'add_description_to_menu', 10, 4);
    
Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: