Share on facebook
Share on twitter
Share on vk
Share on telegram
Share on whatsapp

Такая функция есть в некоторых темах по умолчанию, например у Futurio. На мой взгляд это очень удобная штука, если на сайте создана объемная главная страница, на которой необходима навигация с помощью якорей. В какой-то момент у меня появились новые задачи, под которые Futurio уже не подходила, я подыскал другую тему. Но у этой темы нет возможности определять свое меню для главной страницы.

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

Постановка задачи

Возможность определения отдельного меню для главной страницы должна заключать в себе возможность создавать меню и добавлять его на главную без вмешательства в программный код. Иными словами, решение должно быть универсальным.

Решение задачи я не видел, но знал что мне нужно. Мне нужно чтобы при добавлении меню в область условно “Меню на главной странице”, меню появлялось и находилось только на главной странице.

Первые шаги в реализации

На тот момент у меня вообще не было понимания как устроена система подключения меню и областей для меню. Я обратился к знакомому спецу по WordPress. Тот меня направил в сторону wp_register_nav_menu(). Эта функция регистрирует область для меню.

Я не понимал зачем мне создавать отдельное расположение, если мне нужно в имеющемся расположении установить свое меню. В изучении функций wp_register_nav_menu и wp_nav_menu, я пришел к фильтру wp_nav_menu_args. С его помощью мы можем перехватить установку меню функцией wp_nav_menu и заменить некоторые параметры. Уменя получился вот такой код:

add_filter( 'wp_nav_menu_args', 'my_wp_nav_menu_args' );
function my_wp_nav_menu_args( $args = '' ){
  if ( is_home() || is_front_page() ) {
    $args['menu'] = 'Меню на главной';
  }
  return $args;
}

Не смотря на то, что это решение работало, меня воротило от этого адского костыля. Мне нужна функциональность. Тем более что этот вариант менял все меню, если их больше одного на странице.

Модифицируем неудачное решение

Перво наперво нужно проверить что то или иное меню принадлежит той области, в которой мы хотим заменить меню. Для этого мне пришлось узнать слаг расположения. Для этого функцией print_r() пришлось распечатать параметры меню. Слаг нужного мне расположения оказался primary.

Все классно если мы делаем сайт для себя, а если для клиента? Предположим он грохнет меню, ID которого мы зашили в код, и создаст новое? Он не сможет ничего сделать, наше решение перестанет работать. Значит нам нужно как-то динамически определять то меню, которое нужно вывести на главной.

Очевидное решение: свое расположение. Добавляется оно просто:

add_action( 'after_setup_theme', function(){
	register_nav_menus( [
		'header_home_menu' => 'Меню на главной странице'
	] );
} );

Теперь мы можем удалять и создавать меню сколько нам захочется. Достаточно будет просто поставить галочку в нужном расположении.

Указание расположения для меню на главной странице
Указание расположения для меню на главной странице

Проблема лишь в том, что наш сайт пока не знает что надо это меню поместить на главной. Нам нужно доработать наш код:

add_filter( 'wp_nav_menu_args', 'my_wp_nav_menu_args' );

function my_wp_nav_menu_args( $args = '' ){
	if ( ( is_home() || is_front_page() ) && $args['theme_location'] == 'primary' ) {
		if ( has_nav_menu( 'header_home_menu'] ) ) {
			$locations = get_nav_menu_locations();
			$args['menu'] = $locations['header_home_menu'];
		}
	}
	return $args;
}

Что тут добавилось? Функция has_nav_menu, которая проверяет прикреплено ли меню к нашему расположению header_home_menu. Если прикреплено, значит нам нужно получить ID этого меню. Для этого запрашиваем все расположения функцией get_nav_menu_locations и получаем ID и меняем параметр menu. Вот и все, теперь у нас все автоматизировано. За исключением лишь расположения primary, которое зашито намертво.

Share on facebook
Share on twitter
Share on vk
Share on telegram
Share on whatsapp

Бидюков Денис

Эксперт по сайтам

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