Как создать меню в WordPress с помощью хука wp_nav_menu

Меню — важный элемент любой темы WordPress, который обеспечивает удобную навигацию по сайту. В этой статье мы подробно разберём, как создать кастомное меню в WordPress с помощью встроенного хука wp_nav_menu, как зарегистрировать меню, вывести его в шаблоне и кастомизировать с помощью фильтров и функций. Всё это позволит вам гибко управлять меню без использования плагинов и сторонних решений.

Регистрация меню в WordPress: функция wplessons_register_menu

Первый шаг — зарегистрировать меню, чтобы оно появилось в админке WordPress и его можно было назначить на локацию в теме. Для этого используется функция register_nav_menus. Рекомендуем обернуть вызов в собственную функцию, например, wplessons_register_menu, и добавить её на хук after_setup_theme.

function wplessons_register_menu() {
    register_nav_menus([
        'header-menu' => 'Главное меню в шапке',
        'footer-menu' => 'Меню в подвале'
    ]);
}
add_action('after_setup_theme', 'wplessons_register_menu');

После добавления этого кода в файл functions.php вашей темы, вы увидите новые локации меню в админке WordPress в разделе «Внешний вид» -> «Меню».

Вывод меню в шаблоне с помощью wp_nav_menu

Чтобы вывести меню в нужном месте шаблона (например, в файле header.php для главного меню), используйте функцию wp_nav_menu. Она принимает массив параметров, где ключевой — 'theme_location', указывающий на зарегистрированную локацию.

wp_nav_menu([
    'theme_location' => 'header-menu',
    'container' => 'nav',
    'container_class' => 'header-navigation',
    'menu_class' => 'menu',
    'fallback_cb' => false
]);

Здесь мы обернули меню в тег <nav> с классом, а также отключили вывод меню по умолчанию, если оно не назначено. Это удобно для точного контроля разметки.

Настройка CSS классов и структуры меню

Параметры container_class и menu_class позволяют задать свои классы для обёртки и списка. В дальнейшем их можно использовать для стилизации в CSS.

Кроме того, вы можете использовать параметр items_wrap для изменения обёртки списка меню. По умолчанию это <ul id="%1$s" class="%2$s">%3$s</ul>, где %1$s — id списка, %2$s — класс, а %3$s — пункты меню.

Кастомизация вывода меню через фильтры и Walker

Иногда стандартного вывода меню недостаточно, и требуется изменить HTML-разметку или добавить свои атрибуты. Для этого используется класс-наследник Walker_Nav_Menu. Создадим свой класс Wplessons_Walker_Nav_Menu, который позволит добавлять иконки к пунктам меню.

class Wplessons_Walker_Nav_Menu extends Walker_Nav_Menu {
    function start_el(&$output, $item, $depth=0, $args=null, $id=0) {
        $icon = get_post_meta($item->ID, '_menu_item_icon', true);
        $icon_html = $icon ? '<i class="' . esc_attr($icon) . '"></i> ' : '';
        $output .= '<li><a href="' . esc_attr($item->url) . '">' . $icon_html . esc_html($item->title) . '</a>';
    }
    function end_el(&$output, $item, $depth=0, $args=null) {
        $output .= '</li>';
    }
}

Для использования этого класса передайте его в параметр walker:

wp_nav_menu([
    'theme_location' => 'header-menu',
    'walker' => new Wplessons_Walker_Nav_Menu()
]);

Чтобы добавить иконки к пунктам меню, можно использовать дополнительное поле в админке с помощью плагина Advanced Custom Fields (ACF) или вручную через фильтр wp_nav_menu_item_custom_fields. Пример добавления метаполя выходит за рамки данной статьи, но это гибкий подход к кастомизации.

Примеры полезных плагинов для работы с меню

Если вы предпочитаете готовые решения, обратите внимание на следующие плагины:

  • Max Mega Menu — позволяет создавать мегаменю с расширенной структурой и стилями без кода.
  • WP Mega Menu — аналогичный плагин с визуальным конструктором.
  • Menu Icons by ThemeIsle — простой способ добавить иконки к пунктам меню.

Эти плагины помогут быстро реализовать сложные меню, но при знании PHP и WordPress API можно добиться более оптимального и тонко настроенного результата.

Дополнительные советы по работе с меню в WordPress

Кэширование меню

Для ускорения загрузки сайта рекомендуем кэшировать меню, особенно если оно сложное. Можно использовать транзиенты WordPress или внешний кеш. Пример кода для кэширования меню с помощью транзиентов:

function wplessons_get_cached_menu($location) {
    $cache_key = 'wplessons_menu_' . $location;
    $menu = get_transient($cache_key);
    if (false === $menu) {
        ob_start();
        wp_nav_menu(['theme_location' => $location]);
        $menu = ob_get_clean();
        set_transient($cache_key, $menu, HOUR_IN_SECONDS);
    }
    return $menu;
}

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

Работа с адаптивным меню и мобильными версиями

Создание адаптивного меню — отдельная тема, но важно отметить, что при кастомизации меню через wp_nav_menu стоит учитывать мобильные устройства. Часто используют JavaScript и CSS для реализации выпадающих и бургер-меню. Важно правильно структурировать HTML, чтобы обеспечить доступность и удобство.

Например, добавьте кнопку для открытия меню с aria-атрибутами и переключайте классы через JS:

<button aria-expanded="false" aria-controls="primary-menu" id="menu-toggle">Меню</button>
<nav id="site-navigation" class="main-navigation">
    <?php wp_nav_menu(['theme_location' => 'header-menu', 'menu_id' => 'primary-menu']); ?>
</nav>

И через JavaScript меняйте aria-expanded и видимость меню.

Итог

Создание и кастомизация меню в WordPress — задача, требующая понимания функций API, хуков и возможностей темы. Использование функций register_nav_menus и wp_nav_menu, а также наследование от Walker_Nav_Menu позволяет создавать уникальные и удобные меню без лишнего кода или плагинов. Плагины помогут ускорить разработку, но знание основ всегда полезно для гибкой настройки.

Автоматическое удаление товаров из заказов WooCommerce после отмены или возврата
09.06.2026
Как удалить или изменить автора старой записи в WordPress без плагинов
18.02.2026
Как добавить автоматическое удаление старого контента в WordPress
09.01.2026
Как сделать автоматический импорт постов в WordPress из внешнего источника
25.03.2026
Как создать собственный виджет в WordPress с примером кода
30.11.2025