Создание меню

1. Правда ли, что меню в WordPress — это просто список ссылок?
Нет, это распространённое упрощение. Технически меню — это таксономия (nav_menu), к которой привязаны элементы (post_type = nav_menu_item). Каждый элемент хранит не только URL, но и мета-поля: тип объекта (страница, запись, произвольная ссылка), CSS-классы, атрибуты rel, целевое окно, описание и порядок сортировки. Опытные специалисты используют эти поля для генерации сложных мегаменю, многоуровневых структур и адаптивной навигации через хуки и фильтры.
2. Какие типы объектов можно добавлять в меню через стандартный интерфейс?
Стандартный редактор «Меню» (wp-admin/nav-menus.php) позволяет добавлять: страницы, записи, произвольные типы записей (например, товары WooCommerce), рубрики, метки и другие публичные таксономии. Также доступны произвольные ссылки и пункты «для входа/выхода». Однако профессиональный подход предполагает расширение этого списка через хук wp_get_nav_menu_items или добавление кастомных метабоксов — например, для привязки к терминам произвольных таксономий, которые по умолчанию скрыты.
3. Как избежать дублирования пунктов меню при использовании стандартных виджетов?
Это частая ошибка: разработчики добавляют рубрику в меню вручную, а затем подключают виджет «Рубрики», что создаёт дубли ссылок. Решение — использовать условные теги (has_nav_menu()) и проверять, назначено ли меню для конкретной области. Профессионалы также применяют хук wp_nav_menu_objects для фильтрации дублирующихся пунктов по URL или ID, а также инспектируют исходники темы, чтобы исключить двойное отображение.
4. Почему не стоит полагаться только на CSS-классы из админки?
Поле «CSS-классы» в редакторе меню — удобный, но ограниченный инструмент. При смене темы или обновлении шаблона классы могут перестать применяться, если новая тема не выводит фильтр nav_menu_css_class. Надёжнее добавлять классы через functions.php с помощью фильтра nav_menu_link_attributes или nav_menu_item_id. Это гарантирует независимость от интерфейса админки и позволяет задавать классы динамически, например, на основе родительской рубрики или уровня вложенности.
5. Как настроить разные меню для разных страниц без плагинов?
Да, это реализуется без внешних расширений. В файле header.php или шаблоне обёртки используется условный тег и регистрация нескольких областей меню. Базовый план:
- Зарегистрируйте две области:
primary_menuиsecondary_menu. - В админке создайте отдельные меню и назначьте их в соответствующие области.
- В коде шаблона проверьте условие:
if (is_front_page()) { wp_nav_menu(array('theme_location' => 'primary_menu')); } else { wp_nav_menu(array('theme_location' => 'secondary_menu')); }
Профессиональный нюанс: используйте wp_get_nav_menu_name(), чтобы не дублировать условие для каждой области.
6. Какие параметры в wp_nav_menu() действительно важны для производительности?
Ключевые параметры: theme_location (обязательно — меню кэшируется по области), container (исключите лишние обёртки, задайте false или пустую строку), items_wrap (оптимизируйте вывод HTML, убрав лишние атрибуты). Важно отключать echo при необходимости вернуть строку для дальнейшей обработки. Для крупных меню используйте depth (ограничьте уровень вложенности) и fallback_cb (избегайте вызова wp_page_menu(), который грузит все страницы). Хук pre_wp_nav_menu позволяет полностью заменить вывод на кэшированную версию.
7. Как правильно организовать многоуровневое меню на основе таксономий?
Многие пытаются вручную связывать родительские и дочерние пункты, что ведёт к путанице при масштабировании. Профессиональный метод — использовать иерархию таксономий (например, рубрик) и автоматическое построение через фильтр wp_get_nav_menu_items. Алгоритм действий:
- Получите список корневых терминов таксономии.
- Для каждого термина создайте элемент меню с URL =
get_term_link( $term ). - Используйте рекурсивную функцию для обхода дочерних терминов, назначая правильные
menu_item_parent(ID родительского элемента). - Задайте
object_idравным ID термина для корректного выделения активного пункта.
Такой подход полностью синхронизирует меню со структурой таксономий, исключая ручные ошибки.
8. Почему меню может исчезать при смене темы и как этого избежать?
Меню хранятся в базе данных как записи (nav_menu_item) и таксономии (nav_menu). При активации новой темы, если в её register_nav_menus() указаны другие идентификаторы (theme_location), связь теряется — меню остаётся в БД, но не отображается. Решение — не менять ID областей в теме (лучше добавить новые через дочернюю тему), либо использовать хук after_switch_theme для автоматического переприсвоения меню к новым областям. Индивидуальный подход — хранить соответствие location => ID меню в опциях темы (update_option) и восстанавливать при переключении.
9. Какие атрибуты ссылок в меню можно считать «невидимыми» для поисковых систем?
Индексирование пунктов меню зависит от атрибута rel и значения nofollow. Однако профессиональная оптимизация требует различать: rel="nofollow" (не передаёт вес), rel="sponsored" (для рекламных ссылок) и rel="ugc" (пользовательский контент). В настройках меню WordPress нет интерфейса для этих значений, поэтому их добавляют через фильтр nav_menu_link_attributes на основе класса элемента или мета-поля. Для скрытия пункта от индексации полностью (без ссылки) потребуется удалить через wp_nav_menu_items. Важно: display:none или visibility:hidden не влияют на индексацию.
10. Как отладить некорректную работу меню без плагинов отладки?
Начните с проверки базы данных: запустите SELECT * FROM wp_posts WHERE post_type = 'nav_menu_item' и SELECT * FROM wp_term_taxonomy WHERE taxonomy = 'nav_menu'. Затем проверьте корректность menu_order и post_parent. Включите WP_DEBUG: добавьте в wp-config.php константы define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false);. После этого в файл debug.log будут писаться ошибки, связанные с отсутствием определённых таксономий или записей. Также используйте инструмент «Запросы» (Query Monitor) — он покажет, сколько запросов идёт на формирование меню. Основные проблемы: несуществующие object_id (удалённые страницы) и зацикленные родительские связи (используйте get_ancestors() для выявления).
Добавлено: 24.04.2026
