@GrimJack

Как указывать разные аргументы к разным областям меню?

Есть 2 области меню (предположим шапка и футер). В шапке свое построение (свои классы и тд), а в футере свое. По логике так:
register_nav_menus(array(
	'top'    => 'Верхнее меню',
	'foo1' => 'Футер 1'
));

add_filter( 'wp_nav_menu_args', 'top' );
function top(){
	
	$args = array(
		'container'       => false,           // (string) Контейнер меню. Обворачиватель ul. Указывается тег контейнера (по умолчанию в тег div)
		'menu_class'      => 'menu sections',          // (string) class самого меню (ul тега)
		'menu_id'         => '',              // (string) id самого меню (ul тега)
		'echo'            => true,            // (boolean) Выводить на экран или возвращать для обработки
		'fallback_cb'     => 'wp_page_menu',  // (string) Используемая (резервная) функция, если меню не существует (не удалось получить)
		'before'          => '',              // (string) Текст перед <a> каждой ссылки
		'after'           => '',              // (string) Текст после </a> каждой ссылки
		'link_before'     => '',              // (string) Текст перед анкором (текстом) ссылки
		'link_after'      => '',              // (string) Текст после анкора (текста) ссылки
		'items_wrap'      => '<ul id="%1$s" class="%2$s">%3$s</ul>',
		'depth'           => 2,               // (integer) Глубина вложенности (0 - неограничена, 2 - двухуровневое меню)
		'walker'          => '',              // (object) Класс собирающий меню. Default: new Walker_Nav_Menu
		'theme_location'  => 'top'               // (string) Расположение меню в шаблоне. (указывается ключ которым было зарегистрировано меню в функции register_nav_menus)
	);
	return $args;
}

add_filter( 'wp_nav_menu_args', 'footer' );
function footer(){
	
	$args = array(
		'container'       => false,           // (string) Контейнер меню. Обворачиватель ul. Указывается тег контейнера (по умолчанию в тег div)
		'menu_class'      => 'f-nav f-nav__list',          // (string) class самого меню (ul тега)
		'menu_id'         => '',              // (string) id самого меню (ul тега)
		'echo'            => true,            // (boolean) Выводить на экран или возвращать для обработки
		'fallback_cb'     => 'wp_page_menu',  // (string) Используемая (резервная) функция, если меню не существует (не удалось получить)
		'before'          => '',              // (string) Текст перед <a> каждой ссылки
		'after'           => '',              // (string) Текст после </a> каждой ссылки
		'link_before'     => '',              // (string) Текст перед анкором (текстом) ссылки
		'link_after'      => '',              // (string) Текст после анкора (текста) ссылки
		'items_wrap'      => '<ul id="%1$s" class="%2$s">%3$s</ul>',
		'depth'           => 2,               // (integer) Глубина вложенности (0 - неограничена, 2 - двухуровневое меню)
		'walker'          => '',              // (object) Класс собирающий меню. Default: new Walker_Nav_Menu
		'theme_location'  => 'foo1'               // (string) Расположение меню в шаблоне. (указывается ключ которым было зарегистрировано меню в функции register_nav_menus)
	);
	return $args;
}

Вывожу так:
<?php wp_nav_menu( array('theme_location'=>'foo1') );?>

Но почему-то нижний фильтр перекрывает верхний.
Как избежать такого перекрытия?
  • Вопрос задан
  • 221 просмотр
Пригласить эксперта
Ответы на вопрос 1
wppanda5
@wppanda5 Куратор тега WordPress
WordPress Mедведь
Потому, что вы вызываете tго позже, и не разобрались тем, как работает фильтр.

Пример из кодекса с пояснениями:

/**
* @param $args array  - массив с параметрами меню
*/
function modify_nav_menu_args( $args )
{
	if( 'primary' == $args['theme_location'] )   // ecли вызывается меню  с расположением primary модифицируем меню
	{
		$args['depth'] = -1;
		$args['container_id'] = 'my_primary_menu';
	}

	return $args;
}

add_filter( 'wp_nav_menu_args', 'modify_nav_menu_args' );
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы