Как сделать динамическое меню в WordPress с изменяющимся активным пунктом

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

Почему важно выделять активный пункт меню в WordPress

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

WordPress автоматически добавляет класс current-menu-item к пункту меню, если меню создается через штатный механизм wp_nav_menu(). Однако в кастомных меню или при использовании нестандартных структур могут возникать проблемы, когда активный пункт не подсвечивается корректно.

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

Создание динамического меню с помощью wp_nav_menu и фильтров WordPress

Самый простой способ — использовать встроенную функцию wp_nav_menu() и убедиться, что меню правильно назначено и зарегистрировано. Вот пример регистрации меню в файле functions.php вашей темы:

function wpskins_register_menus() {
    register_nav_menus(array(
        'primary' => __('Основное меню', 'wpskins'),
    ));
}
add_action('after_setup_theme', 'wpskins_register_menus');

Затем выводим меню в шаблоне:

wp_nav_menu(array(
    'theme_location' => 'primary',
    'menu_class' => 'main-navigation',
    'container' => 'nav',
));

WordPress автоматически добавит класс current-menu-item к активному пункту. Однако если у вас кастомная логика или вы хотите расширить поведение, можно применить фильтр nav_menu_css_class для добавления или изменения классов.

Добавление пользовательского класса активному пункту меню

Пример функции, которая выделит пункт меню, если пользователь находится на странице с указанным условием:

function wpskins_custom_active_nav_class($classes, $item) {
    // Проверяем, если текущая страница - страница с ID 42
    if (is_page(42) && in_array('menu-item-' . $item->ID, $classes)) {
        $classes[] = 'wpskins-active';
    }
    return $classes;
}
add_filter('nav_menu_css_class', 'wpskins_custom_active_nav_class', 10, 2);

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

Динамическое меню с изменением активного пункта для пользовательских типов записей и таксономий

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

Рассмотрим пример, когда у вас есть CPT portfolio и таксономия project_category. Нужно, чтобы при просмотре записи CPT или архива таксономии выделялся пункт меню «Портфолио».

function wpskins_highlight_portfolio_menu($classes, $item) {
    // ID или URL пункта меню, который ведет на архив портфолио
    $portfolio_url = get_post_type_archive_link('portfolio');
    $menu_url = $item->url;

    if ((is_singular('portfolio') || is_post_type_archive('portfolio') || is_tax('project_category')) && $menu_url == $portfolio_url) {
        $classes[] = 'current-menu-item';
    }

    return $classes;
}
add_filter('nav_menu_css_class', 'wpskins_highlight_portfolio_menu', 10, 2);

Таким образом, даже если пользователь находится внутри записи портфолио или категории проектов, меню будет выделять пункт «Портфолио».

Создание кастомного меню с динамическим активным пунктом без использования wp_nav_menu

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

function wpskins_get_dynamic_menu() {
    $menu_items = array(
        array('title' => 'Главная', 'url' => home_url('/')),
        array('title' => 'Блог', 'url' => home_url('/blog/')),
        array('title' => 'Портфолио', 'url' => home_url('/portfolio/')),
        array('title' => 'Контакты', 'url' => home_url('/contacts/')),
    );

    $current_url = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

    echo '<ul class="custom-menu">';
    foreach ($menu_items as $item) {
        $active_class = '';
        if (strpos($current_url, $item['url']) === 0) {
            $active_class = 'active';
        }
        echo '<li class="menu-item ' . $active_class . '"><a href="' . esc_url($item['url']) . '">' . esc_html($item['title']) . '</a></li>';
    }
    echo '</ul>';
}

Здесь мы вручную создаем массив пунктов меню и динамически добавляем класс active к тому пункту, URL которого совпадает с текущим адресом. Это простой способ для небольших сайтов или кастомных решений.

Использование плагина Clearfy Pro для расширенного управления меню и оптимизации

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

Особенно полезен для сайтов с кастомными скинами, где требуется тонкая настройка и оптимизация.

Вывод

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

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

Как удалить критические CSS стили WooCommerce без повреждения функционала
26.04.2026
Как создать динамические стили для пользователей в WordPress
06.02.2026
Как создать адаптивный WordPress скин с помощью SASS
01.12.2025
Как удалить CSS стили от подключённых плагинов WordPress для оптимизации загрузки
22.02.2026
Как создать уникальные стили для разных типов записей в WordPress
31.01.2026