WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

register_nav_menus() WP 3.0

Регистрируется сразу несколько расположений меню, к которым затем прикрепляются меню.

Произвольные меню настраиваются в админ-панели и выводятся в шаблоне функцией wp_nav_menu().

При создании меню в него можно разные ссылки: на рубрики, метки, страницы, посты, внешние ссылки и т.д.

Регистрация произвольного меню для админки

Функция одновременно регистрирует поддержку навигационных меню темой.

Функцию принято вызывать во время события after_setup_theme.

Является основой для: register_nav_menu()

Хуков нет.

Возвращает

Функция ничего не возвращает.

Использование

<?php register_nav_menus( $locations ); ?>
$locations(массив) (обязательный)
Массив с названиями (ключи массива) и описаниями (значения ключей) каждого создаваемого меню.
По умолчанию: нет

Примеры

#1. Пример, регистрации сразу двух меню.

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

add_action('after_setup_theme', function(){
	register_nav_menus( array(
		'header_menu' => 'Меню в шапке',
		'footer_menu' => 'Меню в подвале'
	) );
});

Выводить меню в шаблоне будем функцией wp_nav_menu().

Заметки

Эта функция автоматически регистрирует поддержку навигационных меню для темы, т.е. используя эту функцию нет необходимости предварительно вызывать функцию: add_theme_support( 'menus' );

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

Код register_nav_menus: wp-includes/nav-menu.php VER 5.0.1

<?php
function register_nav_menus( $locations = array() ) {
	global $_wp_registered_nav_menus;

	add_theme_support( 'menus' );

	$_wp_registered_nav_menus = array_merge( (array) $_wp_registered_nav_menus, $locations );
}

Cвязанные функции

Из метки: nav_menu (меню навигации)

Еще из раздела: Другие функции темы

10 комментов
  • @ jvj

    Доброго времени суток. Регистрирую меню с помощью данной функции, локализуя их

    register_nav_menus( 
    		array(
    			'main_menu' => __( 'Primary menu', 'themeloc' ),
    			'foot_menu'  => __( 'Footer menu', 'themeloc' ),
    		)
    	 );

    В админке названия меню не локализуются, отображаются как 'Primary menu', 'Footer menu', хотя в файле локализации они естественно переведены. Локализация подключена, работает везде по сайту, всё переводится корректно, кроме этих названий меню sad Что странно, что в той же twentyfifteen таким же образом подключены меню и они отображаются на русском.
    Может сможете что-то подсказать, в чём причина?

    1
    Ответить3.1 года назад #
    • @ jvj

      Разобрался, добавлю, может кто на такие же грабли наступит. Функция не была повешена на событие - в результате меню регистрировалось и работало, но не переводилось. Перенес вызов функции в событие 'after_setup_theme' - перевод заработал.

      1
      Ответить3.1 года назад #
      • Kama7144

        Спасибо за вопрос и ответ на него. Дополнил пример в описании. thank_you

        Ответить3.1 года назад #
  • Привет) Сколько таких меню можно зарегистрировать?

    Ответить1.4 года назад #
  • Зарегистрировал 2 меню - в шапке и подвале, выявил проблему - в обоих меню отображаются одинаковые пункты, хотя должны быть разные по замыслу

    Код регистрации меню в functions.php:

    add_theme_support('menus');
    
    add_action('after_setup_theme', function(){
    	register_nav_menus([
    				'primary' => 'Главное шапке',
    		'footer_menu' => 'Меню в подвале'
    				] );
    });

    Код вывода меню в шапке:

    <?php wp_nav_menu([
    					'theme-location' => 'primary',
    					'container'      => FALSE,
    					'menu_class'     => 'navbar-nav ml-auto',
    					'items_wrap'     => '<ul class="%2$s"><li class="nav-item"><a class="nav-link">%3$s</a></li></ul>',
    					]
    				);?>

    Код вывода меню в подвале:

    <?php wp_nav_menu([
    							'theme-location'    => 'footer',
    							'container'         => FALSE,
    							'menu class'        => 'bottom-menu list-unstyled',
    							'items_wrap'        => '<ul id="%1$s" class="%2$s">%3$s</ul>',
    						]);?>

    Возможно, причина кроется в этом куске (были проблемы с отображением меню в шапке -пункты прилипали друг к другу)

    //Добавление класса .nav-link к ссылкам из пунктов верхнего меню
    function add_class_to_all_menu_anchors( $atts ) {
    	$atts['class'] = 'nav-link';
    
    	return $atts;
    }
    add_filter( 'nav_menu_link_attributes', 'add_class_to_all_menu_anchors', 10 );

    В общем, буду рад вашей помощи

    Ответить9 мес назад #
    • @ campusboy3081 cайт: www.youtube.com/c/wpplus

      Если используется register_nav_menus, то нет смысла уже писать add_theme_support('menus'). Идём дальше - что за параметр theme-location? Может всё-таки theme_location? Для футера ID области меню footer_menu, а в wp_nav_menu передаётся footer.

      1
      Ответить9 мес назад #
  • Петр

    Приветствую. Сделал вот такую вещь

    add_action('after_setup_theme', 'enqueue_menus');
    
    $menus = array(
    	'header_nav' => 'Навигация', 
    	'header_top_menu' => 'Верхнее меню в шапке'
    );
    
    function enqueue_menus() {
    	register_nav_menus($menus);
    }

    В результате выбивает ошибку Warning : array_merge(): Argument #2 is not an array in ... и т.д в какой то файл ведет wp-includes/nav-menu.php on line 93

    Вопрос, почему?

    Ответить6 мес назад #
    • @ campusboy3081 cайт: www.youtube.com/c/wpplus

      Привет. Выучите основы PHP, в данном случае раздел видимости переменных.

      Надо так (рекомендую):

      add_action('after_setup_theme', 'enqueue_menus');
      
      function enqueue_menus() {
      	$menus = array(
      		'header_nav' => 'Навигация', 
      		'header_top_menu' => 'Верхнее меню в шапке'
      	);
      
      	register_nav_menus( $menus );
      }

      Или хотя бы так (не рекомендую):

      add_action('after_setup_theme', 'enqueue_menus');
      
      $menus = array(
      	'header_nav' => 'Навигация', 
      	'header_top_menu' => 'Верхнее меню в шапке'
      );
      
      function enqueue_menus() {
      	register_nav_menus( $GLOBALS['menus'] );
      }
      2
      Ответить6 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться