Документация по аргументу "items_wrap" функции wp_nav_menu

5 июн. 2011 г., 08:01:58
Просмотры: 64.3K
Голосов: 52

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

Что именно означают "%1$s" и "%2$s"? (Может кто-нибудь объяснить простыми словами?)

0
Все ответы на вопрос 2
5
70

Параметр 'items_wrap' для функции wp_nav_menu() по умолчанию имеет значение:

'<ul id="%1$s" class="%2$s">%3$s</ul>'

Это шаблон, который обрабатывается с помощью sprintf():

$nav_menu .= sprintf(
    $args->items_wrap
,   esc_attr( $wrap_id )    // %1$s
,   esc_attr( $wrap_class ) // %2$s
,   $items                  // %3$s
);

Нумерованные плейсхолдеры – %1$s, %2$s, %3$s – ссылаются на аргументы после первого аргумента в sprintf(). Символ процента обозначает плейсхолдер, число – позицию, а тип s означает, что значение должно обрабатываться как строка.
Не изменяйте тип, если вы точно не знаете, что делаете. :)

  • $wrap_id – это параметр 'menu_id', если он задан, в противном случае используется 'menu-' . $menu->slug.
  • $wrap_class – это параметр 'menu_class', если он задан, иначе он пустой.
  • $items – строка с внутренним содержимым меню.

Допустим, вам не нужен атрибут class. Просто пропустите вторую строку:

wp_nav_menu( array( 'items_wrap' => '<ul id="%1$s">%3$s</ul>' ) );

Если вам не нужны ни class, ни id, и вы хотите использовать другой контейнер (например, потому что использовали кастомный walker):

wp_nav_menu( array( 'items_wrap' => '<div>%3$s</div>' ) );

Главное правило: вы должны использовать номера замен, которые заданы в wp_nav_menu(). %3$s всегда означает список пунктов меню.

5 июн. 2011 г. 08:58:05
Комментарии

Спасибо, что попытались объяснить. Вроде понимаю, но у меня не получается. Я хочу добавить, скажем, класс к моим элементам li. Вы, кажется, используете ul для каждого элемента? Также я не вижу sprintf в своём коде, поэтому не совсем понятно.

landed landed
9 сент. 2016 г. 15:31:04

@landed Это для всего меню, а не для каждого элемента. Пожалуйста, воспользуйтесь поиском, у нас уже есть готовые решения для вашей проблемы.

fuxia fuxia
9 сент. 2016 г. 16:27:01

Я искал в интернете, и у других была такая же проблема. Мне пришлось расширить класс walker и добавить туда свой HTML. Это сработало, но пришлось скопировать довольно много кода из старого класса, переименовать его, изменить, а затем указать меню использовать мой пользовательский класс walker. Спасибо.

landed landed
10 сент. 2016 г. 20:29:29

Возможно, я немного опоздал на вечеринку, но если вы хотите добавить текст в items_wrap, как бы вы его интернационализировали?

henrywright henrywright
19 сент. 2016 г. 15:42:44

@henrywright Сначала переведите значения, а затем передайте их в строку.

fuxia fuxia
19 сент. 2016 г. 15:59:53
0

Насколько я понимаю, этот код получает вывод и присваивает элементу li идентификатор и класс с названием меню. Таким образом, когда нужно стилизовать конкретное меню, вы обращаетесь к его id и/или классу. Цифры 1 и 2 — это просто разные варианты вывода.

5 июн. 2011 г. 08:12:36