Динамическое меню в WordPress — это удобный способ управления навигацией сайта, при котором пункты меню формируются автоматически на основе данных сайта или определённой логики. Это особенно полезно, когда меню должно меняться в зависимости от условий, например, ролей пользователей, категории записи или других параметров. В этой статье мы подробно рассмотрим, как создать динамическое меню с помощью PHP, используя встроенные возможности WordPress и собственный код.
Почему стоит создавать динамическое меню в WordPress
Стандартный функционал WordPress позволяет создавать меню через административную панель, но если вам нужно меню с уникальной логикой — например, показывать пункты только для авторизованных пользователей, подгружать пункты из произвольных типов записей или менять структуру в зависимости от текущей страницы — стандартный конструктор меню не всегда подходит.
Динамическое меню:
- Автоматически обновляется при изменениях контента;
- Позволяет реализовать сложную логику отображения;
- Улучшает UX, показывая релевантные пункты;
- Снижает количество ручных действий для администраторов.
Давайте рассмотрим, как создать такое меню с нуля.
Регистрация кастомного меню в WordPress
Первым шагом необходимо зарегистрировать новое место для меню в теме. Это делается в файле functions.php вашей темы или в плагине, если вы хотите отделить логику от темы.
function wpkit_register_dynamic_menu() {
register_nav_menu('wpkit_dynamic_menu', __('WPKit Динамическое меню'));
}
add_action('after_setup_theme', 'wpkit_register_dynamic_menu');Теперь у вас появится новое место для меню в админке WordPress, куда можно привязать любое меню. Однако мы не будем использовать статическое меню, а создадим динамическую генерацию.
Создание функции для динамического построения меню
Для динамического меню мы создадим функцию wpkit_get_dynamic_menu_items(), которая будет возвращать массив пунктов меню в нужном формате.
Рассмотрим пример, когда меню формируется из категорий блога с добавлением пункта «Главная» и пункта «Контакты».
function wpkit_get_dynamic_menu_items() {
$menu_items = [];
// Пункт Главная
$menu_items[] = [
'title' => 'Главная',
'url' => home_url('/'),
'ID' => 1
];
// Получаем категории
$categories = get_categories(['hide_empty' => false]);
foreach ($categories as $cat) {
$menu_items[] = [
'title' => $cat->name,
'url' => get_category_link($cat->term_id),
'ID' => 1000 + $cat->term_id
];
}
// Пункт Контакты
$menu_items[] = [
'title' => 'Контакты',
'url' => home_url('/contacts'),
'ID' => 9999
];
return $menu_items;
}В этом массиве каждый элемент — это пункт меню с заголовком, ссылкой и уникальным ID. ID нужен для правильного формирования HTML и возможного расширения функционала.
Вывод динамического меню в теме
Для вывода меню используем стандартный HTML с классами WordPress. Создадим функцию wpkit_display_dynamic_menu(), которая вызовет wpkit_get_dynamic_menu_items() и сформирует список меню.
function wpkit_display_dynamic_menu() {
$items = wpkit_get_dynamic_menu_items();
echo '<ul class="wpkit-dynamic-menu">';
foreach ($items as $item) {
echo '<li id="menu-item-'.esc_attr($item['ID']).'" class="menu-item">';
echo '<a href="'.esc_url($item['url']).'">'.esc_html($item['title']).'</a>';
echo '</li>';
}
echo '</ul>';
}Вставьте вызов wpkit_display_dynamic_menu() в нужное место темы, например, в header.php.
Добавление условий для динамики меню
Теперь добавим логику отображения пунктов меню в зависимости от контекста. Например, покажем пункт «Профиль» только авторизованным пользователям.
function wpkit_get_dynamic_menu_items() {
$menu_items = [];
$menu_items[] = [
'title' => 'Главная',
'url' => home_url('/'),
'ID' => 1
];
$categories = get_categories(['hide_empty' => false]);
foreach ($categories as $cat) {
$menu_items[] = [
'title' => $cat->name,
'url' => get_category_link($cat->term_id),
'ID' => 1000 + $cat->term_id
];
}
if (is_user_logged_in()) {
$menu_items[] = [
'title' => 'Профиль',
'url' => get_edit_profile_url(get_current_user_id()),
'ID' => 5000
];
} else {
$menu_items[] = [
'title' => 'Вход',
'url' => wp_login_url(),
'ID' => 5001
];
}
$menu_items[] = [
'title' => 'Контакты',
'url' => home_url('/contacts'),
'ID' => 9999
];
return $menu_items;
}Такое меню будет меняться в зависимости от того, вошёл пользователь или нет.
Использование плагина для расширения функционала динамического меню
Если вы хотите не писать всё с нуля, рекомендую обратить внимание на плагин Clearfy Pro. Он позволяет оптимизировать меню, отключать неиспользуемые элементы и добавлять пользовательские условия для показа пунктов. Это ускорит разработку и снизит количество кода.
Итоги и рекомендации
Создание динамического меню — полезный навык для разработчика WordPress, позволяющий сделать навигацию гибкой и адаптивной. Используйте встроенные функции WordPress для получения данных (как get_categories() или is_user_logged_in()) и формируйте массив пунктов меню в удобном формате. Вывод меню организуйте через отдельную функцию, чтобы было удобно менять логику без правки шаблонов.
Обязательно тестируйте меню на разных устройствах и с разными пользователями. При необходимости добавляйте классы и атрибуты для стилизации и улучшения UX.