Динамические меню в WordPress позволяют гибко управлять навигацией сайта, автоматически подстраиваясь под структуру контента и пользовательские права доступа. В этой статье разберём, как создавать динамические меню с помощью собственного кода и популярных плагинов, а также рассмотрим примеры, которые помогут решить конкретные задачи.
Основы создания динамических меню в WordPress
Меню в WordPress обычно создаётся через админ-панель в разделе «Внешний вид» → «Меню». Однако для динамичности, например, отображения категорий, пользовательских ролей или условий, нужно использовать программирование. Основной функцией для вывода меню является wp_nav_menu(), но она работает с зарегистрированными меню и статичным набором пунктов.
Чтобы получить динамическое меню, часто применяют фильтры и хуки, а также создают пользовательские walker-классы для управления выводом пунктов меню. Рассмотрим, как это сделать на практике.
Регистрация меню и добавление динамических пунктов
Для начала регистрируем меню в файле functions.php вашей темы:
function wplink_register_dynamic_menu() {
register_nav_menu('wplink-dynamic-menu', 'Динамическое меню WPLink');
}
add_action('after_setup_theme', 'wplink_register_dynamic_menu');Далее, чтобы динамически добавлять пункты, воспользуемся фильтром wp_get_nav_menu_items. Например, добавим в меню список последних 5 записей из определённой категории:
function wplink_add_recent_posts_to_menu($items, $menu, $args) {
if ($args->theme_location !== 'wplink-dynamic-menu') {
return $items;
}
$recent_posts = get_posts(array(
'numberposts' => 5,
'category_name' => 'novosti'
));
foreach ($recent_posts as $post) {
$item = new stdClass();
$item->ID = 100000 + $post->ID; // уникальный ID
$item->title = $post->post_title;
$item->url = get_permalink($post->ID);
$item->menu_item_parent = 0;
$item->type = '';
$item->object = '';
$item->object_id = $post->ID;
$item->db_id = 0;
$items[] = $item;
}
return $items;
}
add_filter('wp_get_nav_menu_items', 'wplink_add_recent_posts_to_menu', 10, 3);Этот код добавляет в указанное меню последние новости из категории «novosti». Можно адаптировать логику под любые объекты — страницы, таксономии, пользовательские типы записей и т. д.
Использование плагинов для динамических меню
Если не хочется писать код, существуют плагины, которые значительно упрощают создание динамических меню с гибкими условиями и фильтрами.
1. Plugin: WP Mega Menu
Позволяет создавать многоуровневые меню с виджетами, иконками, и динамическим содержимым. Поддерживает условное отображение пунктов и интеграцию с пользовательскими ролями.
2. Plugin: If Menu – Visibility control for menu items
Этот плагин добавляет возможность скрывать или показывать пункты меню на основе условий, например, по статусу пользователя, страницам, роли или другим параметрам. Идеально подходит для создания динамических меню без программирования.
3. Plugin: Clearfy Pro
Хотя Clearfy Pro в первую очередь оптимизирует сайт, в нём есть удобные инструменты для управления кэшированием и очисткой меню, что косвенно помогает при работе с динамическими элементами.
Создание условных динамических меню по ролям пользователей
Одним из частых кейсов является показ меню, зависящего от роли пользователя. Например, отдельные пункты видны только администраторам или подписчикам.
Вот пример кода, который убирает из меню пункты для неавторизованных пользователей и показывает их только после входа в систему:
function wplink_filter_menu_by_user_role($items, $menu, $args) {
if ($args->theme_location !== 'wplink-dynamic-menu') {
return $items;
}
$filtered_items = array();
foreach ($items as $item) {
// Проверяем пользовательское поле меню для ограничения
if (strpos($item->title, '[login_required]') !== false) {
if (is_user_logged_in()) {
$item->title = str_replace('[login_required]', '', $item->title);
$filtered_items[] = $item;
}
} else {
$filtered_items[] = $item;
}
}
return $filtered_items;
}
add_filter('wp_get_nav_menu_items', 'wplink_filter_menu_by_user_role', 10, 3);В этом решении вы добавляете в название пункта меню метку [login_required], и такой пункт отображается только для вошедших в систему.
Оптимизация производительности динамических меню
Динамические меню с большим количеством запросов к базе могут замедлить загрузку сайта. Чтобы избежать этого, рекомендую использовать кэширование результатов с помощью Transients API WordPress.
function wplink_get_cached_dynamic_menu_items($items, $menu, $args) {
if ($args->theme_location !== 'wplink-dynamic-menu') {
return $items;
}
$cache_key = 'wplink_dynamic_menu_items';
$cached_items = get_transient($cache_key);
if ($cached_items !== false) {
return $cached_items;
}
// Здесь ваш код получения динамических пунктов
$new_items = ...; // ваша логика
set_transient($cache_key, $new_items, HOUR_IN_SECONDS);
return $new_items;
}
add_filter('wp_get_nav_menu_items', 'wplink_get_cached_dynamic_menu_items', 10, 3);Это значительно снизит нагрузку на сервер и ускорит отображение меню.
Вывод
Динамические меню — мощный инструмент для создания удобной и адаптивной навигации на сайте WordPress. Используя собственный код и плагины, вы можете легко реализовать меню с автоматическим обновлением, условным отображением и интеграцией с различными типами контента.
Для более глубоких возможностей советую комбинировать кодовые решения с плагинами, такими как Clearfy Pro, что поможет оптимизировать работу меню и всего сайта.