Документация по аргументу "items_wrap" функции wp_nav_menu
Я использую wp_nav_menu и пытаюсь создать пользовательский вывод для выпадающих подменю. Я наткнулся на аргумент "items_wrap", но информации о том, что это такое, как это работает и что с этим можно делать, очень мало.
Что именно означают "%1$s" и "%2$s"? (Может кто-нибудь объяснить простыми словами?)
Параметр '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 всегда означает список пунктов меню.
Спасибо, что попытались объяснить. Вроде понимаю, но у меня не получается. Я хочу добавить, скажем, класс к моим элементам li. Вы, кажется, используете ul для каждого элемента? Также я не вижу sprintf в своём коде, поэтому не совсем понятно.
landed
@landed Это для всего меню, а не для каждого элемента. Пожалуйста, воспользуйтесь поиском, у нас уже есть готовые решения для вашей проблемы.
fuxia
Я искал в интернете, и у других была такая же проблема. Мне пришлось расширить класс walker и добавить туда свой HTML. Это сработало, но пришлось скопировать довольно много кода из старого класса, переименовать его, изменить, а затем указать меню использовать мой пользовательский класс walker. Спасибо.
landed
Возможно, я немного опоздал на вечеринку, но если вы хотите добавить текст в items_wrap, как бы вы его интернационализировали?
henrywright