Документация по аргументу "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 Это для всего меню, а не для каждого элемента. Пожалуйста, воспользуйтесь поиском, у нас уже есть готовые решения для вашей проблемы.

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

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