Динамические меню в 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 — это мощный инструмент для повышения удобства пользователя и адаптации навигации под конкретные задачи сайта.