Как использовать wp_nav_menu для создания выпадающего меню select?

1 сент. 2011 г., 23:50:27
Просмотры: 53.2K
Голосов: 22

Я использую следующее внутри функции wp_nav_menu для создания выпадающего меню select, где каждый пункт меню является опцией в выпадающем списке...

'items_wrap' => '<select>%3$s</select>'
'before'     => '<option value="">'
'after'      => '</option>'

Как добавить значение ссылки в объявление 'before'? Есть ли лучший способ сделать это? Я знаю про wp_dropdown_pages, но это не подходит, так как я хочу, чтобы пользователи могли управлять меню через страницу "Меню".

0
Все ответы на вопрос 3
12
26

Вы не можете сделать это с помощью wp_nav_menu, так как он выводит элементы списка, и ваш код создаст недопустимую разметку.

Попробуйте использовать wp_get_nav_menu_items() вместо этого.


Быстрое решение для выпадающего меню с пользовательским обработчиком (walker):

class Walker_Nav_Menu_Dropdown extends Walker_Nav_Menu{

    // не выводим открывающий тег дочерних элементов (`<ul>`)
    public function start_lvl(&$output, $depth){}

    // не выводим закрывающий тег дочерних элементов    
    public function end_lvl(&$output, $depth){}

    public function start_el(&$output, $item, $depth, $args){

      // добавляем отступы к заголовку в зависимости от текущей глубины
      $item->title = str_repeat("&nbsp;", $depth * 4) . $item->title;

      // вызываем родительский метод и заменяем тег <li>
      // в сгенерированной разметке...
      parent::start_el(&$output, $item, $depth, $args);
      $output = str_replace('<li', '<option', $output);
    }

    // заменяем закрывающий </li> на закрывающий тег option
    public function end_el(&$output, $item, $depth){
      $output .= "</option>\n";
    }
}

В ваших шаблонах используйте это следующим образом:

wp_nav_menu(array(
  'theme_location' => 'primary', // укажите расположение меню в теме
  'walker'         => new Walker_Nav_Menu_Dropdown(),
  'items_wrap'     => '<select>%3$s</select>',
));
1 сент. 2011 г. 23:58:47
Комментарии

На самом деле, при использовании части "items_wrap" удаляются элементы списка, поэтому разметка в порядке. Но я все равно проверю ссылку. Спасибо!

Christopher John Christopher John
2 сент. 2011 г. 00:01:17

да, но это не обрабатывает вложенные <UL> :)

onetrickpony onetrickpony
2 сент. 2011 г. 00:02:19

На самом деле обрабатывает :-)

Christopher John Christopher John
2 сент. 2011 г. 00:09:27

Согласно источнику, это не работает, если только вы не используете кастомный walker...

onetrickpony onetrickpony
2 сент. 2011 г. 00:21:06

Это работает или нет?

chrisl-921fb74d chrisl-921fb74d
13 дек. 2011 г. 18:38:23

@OneTrickPony - как бы вы предложили реализовать кнопку выбора с этим методом?

Travis Northcutt Travis Northcutt
27 февр. 2012 г. 19:14:29

Не совсем понял, что вы имеете в виду под кнопкой выбора? Ссылку с выпадающим меню?

onetrickpony onetrickpony
28 февр. 2012 г. 18:48:49

Я имею в виду, что при использовании этого кода появляется выпадающий список, но ничего не происходит при выборе элемента. Как реализовать кнопку, которая перенаправит пользователя на выбранную страницу/пункт меню? Скриншот: http://f.cl.ly/items/3T3t250Y04031J2o2L1l/Image%202012-03-06%20at%201.30.03%20PM.png

Travis Northcutt Travis Northcutt
6 мар. 2012 г. 21:31:16

либо с помощью JavaScript, используя событие onchange, либо оберните его в форму с кнопкой submit и обработайте перенаправление самостоятельно при обработке формы

onetrickpony onetrickpony
8 мар. 2012 г. 18:07:47

Работает ли этот вокер?? Он не показывает выпадающий список с темой по умолчанию

tamilsweet tamilsweet
16 июн. 2012 г. 15:13:38

Да, он работает. Работает по состоянию на 24 ноября 2012. Скопируйте и вставьте часть "wp_nav_menu(array( ..." в вашу тему, там где вы хотите чтобы появился выпадающий список. НЕ оставляйте его в файле functions.php. Если вы это сделаете, выпадающий список появится когда вызывается functions.php и поэтому он может появиться вверху основного контента, что нежелательно. Так что просто скопируйте функцию в файл functions.php и скопируйте wp_nav_menu туда, где вы хотите чтобы он появился, сохраните оба файла и перезагрузите страницу. Это должно сработать. Я использую версию WP3+, так что убедитесь что вы обновили вашу версию WP. Это может НЕ работать в более старых версиях.

Devner Devner
24 нояб. 2012 г. 18:26:23

Мне пришлось заменить это "parent::start_el($output, $item, $depth, $args);" на это "parent::start_el(&$output, $item, $depth, $args);" чтобы заставить это работать.

dlopezgonzalez dlopezgonzalez
11 сент. 2014 г. 15:11:34
Показать остальные 7 комментариев
0

Я нашел это полезным:

Вы можете использовать следующие подходы для упрощения CSS кода выпадающего меню.

  1. Добавьте класс parent для элементов, у которых есть подменю
  2. Добавьте класс depth (depth0, depth1, depth2 ...)

Добавьте в function.php вашей темы

class DD_Wolker_Menu extends Walker_Nav_Menu {
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ){
        $GLOBALS['dd_children'] = ( isset($children_elements[$element->ID]) )? 1:0;
        $GLOBALS['dd_depth'] = (int) $depth;
        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }
}
add_filter('nav_menu_css_class','add_parent_css',10,2);
function  add_parent_css($classes, $item){
     global  $dd_depth, $dd_children;
     $classes[] = 'depth'.$dd_depth;
     if($dd_children)
         $classes[] = 'parent';
    return $classes;
}

Теперь в header.php

wp_nav_menu( array( 'container_class' => '','container' => '',  'menu' => 'header-menu', 'walker'=> new DD_Wolker_Menu ) );

header-menu замените на название вашего меню

Пример CSS кода может быть таким

#menu-header-menu{
    margin: 0;
    padding: 0;
}
#menu-header-menu  ul{

}

#menu-header-menu> li{
    display: inline;
    margin-left: 1.618em;
}
#menu-header-menu  li{
    list-style: none;
}
#menu-header-menu  li a{
    text-decoration: none;
    font-size:  1em;
    font-family:    'Lato',Helvetica,Arial,sans-serif ;
    letter-spacing: 1px;
}
#menu-header-menu li.parent::after{
    content:'+';
}

#menu-header-menu  .sub-menu {
   display: none;
   position: absolute;
   background-color: #fff;
}

#menu-header-menu  li:hover>.sub-menu{
    display: inline;
    width: auto;
    height: auto;
    border: solid 1px #BBBBBB;
    z-index: +1;
}

где #menu-header-menu - ID основного UL списка (вам также нужно обновить его)

3 мар. 2016 г. 21:47:15
0
-1

Плагин Dropdown Menus действительно отвечает на вопрос: функция wp_nav_menu не может быть использована для создания выпадающего меню в виде select, тогда как плагин предоставляет удобную функцию dropdown_menu(), которая отлично справляется с этой задачей.

2 авг. 2012 г. 14:17:01