Как создать динамическое меню в WordPress с примерами кода

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

Основы создания меню в WordPress

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

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

Регистрация меню в functions.php

Добавьте следующий код в файл functions.php вашей темы:

function wpskill_register_my_menu() {
    register_nav_menu('header-menu', __('Header Menu'));
}
add_action('after_setup_theme', 'wpskill_register_my_menu');

Этот код создаёт новую локацию меню с идентификатором header-menu.

Вывод меню в шаблоне

Чтобы вывести меню в нужном месте (например, header.php), используйте:

wp_nav_menu(array(
    'theme_location' => 'header-menu',
    'container' => 'nav',
    'container_class' => 'main-navigation',
));

Так мы подключили стандартное меню WordPress для последующей динамической работы.

Динамическое построение меню на основе кастомных условий

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

Рассмотрим пример: мы хотим, чтобы в меню отображались только те страницы, которые отмечены специальным метаполем show_in_menu со значением 1.

Добавление метаполя к страницам

Для начала добавьте метаполе к страницам через стандартный пользовательский интерфейс или программно.

Функция для динамического меню

Создадим функцию, которая возвращает массив пунктов меню с учётом метаполя:

function wpskill_get_custom_menu_items() {
    $args = array(
        'post_type' => 'page',
        'meta_key' => 'show_in_menu',
        'meta_value' => '1',
        'orderby' => 'menu_order',
        'order' => 'ASC',
        'posts_per_page' => -1
    );
    $pages = get_posts($args);
    $menu_items = array();
    foreach ($pages as $page) {
        $menu_items[] = (object) array(
            'ID' => $page->ID,
            'title' => $page->post_title,
            'url' => get_permalink($page->ID),
        );
    }
    return $menu_items;
}

Вывод динамического меню

В шаблоне меню заменим стандартный вызов на кастомный:

function wpskill_render_dynamic_menu() {
    $items = wpskill_get_custom_menu_items();
    if (!empty($items)) {
        echo '<nav class="custom-menu"><ul>';
        foreach ($items as $item) {
            echo '<li><a href="' . esc_url($item->url) . '">' . esc_html($item->title) . '</a></li>';
        }
        echo '</ul></nav>';
    }
}

Вызовите wpskill_render_dynamic_menu() там, где нужно вывести меню.

Динамическое меню с условием отображения по ролям пользователей

Частая задача — показывать разные пункты меню для гостей и авторизованных пользователей или для разных ролей.

Пример кода с проверкой роли

function wpskill_get_role_based_menu_items() {
    $menu_items = array();
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        if (in_array('administrator', (array) $user->roles)) {
            $menu_items[] = (object) array('title' => 'Админ панель', 'url' => admin_url());
        }
        $menu_items[] = (object) array('title' => 'Личный кабинет', 'url' => site_url('/profile/'));
        $menu_items[] = (object) array('title' => 'Выход', 'url' => wp_logout_url());
    } else {
        $menu_items[] = (object) array('title' => 'Вход', 'url' => wp_login_url());
        $menu_items[] = (object) array('title' => 'Регистрация', 'url' => wp_registration_url());
    }
    return $menu_items;
}

function wpskill_render_role_based_menu() {
    $items = wpskill_get_role_based_menu_items();
    echo '<nav class="role-menu"><ul>';
    foreach ($items as $item) {
        echo '<li><a href="' . esc_url($item->url) . '">' . esc_html($item->title) . '</a></li>';
    }
    echo '</ul></nav>';
}

Такой подход позволяет гибко настраивать меню в зависимости от контекста и пользователя.

Полезные плагины для динамического меню в WordPress

Если хочется минимизировать кодинг, можно воспользоваться плагинами с расширенными возможностями для управления меню:

  • Max Mega Menu — позволяет создавать динамические и многоуровневые меню с визуальным редактором и условиями отображения.
  • Conditional Menus — плагин для показа разных меню в зависимости от страницы, роли пользователя, устройства и других условий.
  • WP Menu Cart — если у вас WooCommerce, этот плагин динамически добавляет корзину в меню.

Эти плагины можно найти на wpshop.ru с удобной установкой и русскоязычной поддержкой.

Расширение меню с помощью AJAX для динамического обновления

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

Пример простого AJAX-запроса, который обновляет элемент меню с количеством новых сообщений:

add_action('wp_ajax_wpskill_get_notifications_count', 'wpskill_get_notifications_count_callback');
add_action('wp_ajax_nopriv_wpskill_get_notifications_count', 'wpskill_get_notifications_count_callback');

function wpskill_get_notifications_count_callback() {
    $count = 5; // Здесь логика подсчёта уведомлений
    wp_send_json_success(array('count' => $count));
}

// JS для вызова AJAX
// jQuery(document).ready(function($) {
//     function updateNotifications() {
//         $.post(ajaxurl, {action: 'wpskill_get_notifications_count'}, function(response) {
//             if(response.success) {
//                 $('#notification-count').text(response.data.count);
//             }
//         });
//     }
//     updateNotifications();
//     setInterval(updateNotifications, 60000); // обновлять каждую минуту
// });

В шаблоне меню добавьте <span id="notification-count">0</span> рядом с пунктом меню уведомлений.

Советы по оптимизации и безопасности динамических меню

При работе с динамическими меню важно помнить о производительности и безопасности:

  • Используйте кэширование результатов запросов, особенно при сложных фильтрах.
  • Всегда экранируйте выводимые данные через esc_html и esc_url.
  • Проверяйте права доступа пользователя перед показом специальных пунктов меню.
  • Минимизируйте количество запросов к базе данных, объединяя выборки.

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

Как автоматизировать управление ролями и правами в WordPress с примерами кода
17.03.2026
Автоматическое создание Sitemap XML в WordPress: практическое руководство
15.02.2026
Как автоматизировать обновление плагинов в WordPress без ручного вмешательства
04.01.2026
Как автоматически создавать отчёты по посетителям WordPress
08.02.2026
Как создать автоматический отчет по посетителям WordPress с примерами кода
02.03.2026