Хук wp_nav_menu_objects
в WordPress позволяет изменить список объектов пунктов меню перед тем, как на их основе будет сгенерирован HTML-код. С помощью этого фильтра можно добавлять или убирать пункты меню, а также задавать для них CSS-классы или другие атрибуты.
apply_filters( 'wp_nav_menu_objects', array $sorted_menu_items, stdClass $args );
Хук wp_nav_menu_objects
фильтрует отсортированный массив объектов меню, позволяя изменить отображение пунктов, их видимость для разных пользователей и добавить стили. Например, с помощью этого фильтра можно скрыть определенные пункты меню для неавторизованных пользователей или добавить CSS-класс к пунктам меню с дочерними элементами.
Параметры
$sorted_menu_items
(массив): массив объектов пунктов меню, отсортированных в соответствии с порядком, установленным в админ-панели.$args
(объектstdClass
): объект аргументов, переданных функцииwp_nav_menu()
.
Пример 1: Скрытие пунктов меню для гостей
В этом примере удаляются пункты «Корзина» и «Список желаемого» для гостей, то есть пользователей, которые не вошли в систему. Это полезно для создания более персонализированного меню.
add_filter( 'wp_nav_menu_objects', 'hide_menu_items_for_guests', 10, 2 );
function hide_menu_items_for_guests( $menu_objects, $args ) {
// Убедимся, что действие применимо к нужному меню
if ( 'main_menu' !== $args->theme_location ) {
return $menu_objects;
}
// Проверяем, вошел ли пользователь в систему
if ( is_user_logged_in() ) {
return $menu_objects;
}
// Указываем пункты меню для скрытия
$menu_titles_to_hide = array( 'Корзина', 'Список желаемого' );
// Удаляем указанные пункты из меню
foreach ( $menu_objects as $key => $menu_item ) {
if ( in_array( $menu_item->title, $menu_titles_to_hide ) ) {
unset( $menu_objects[ $key ] );
}
}
return $menu_objects;
}
Пример 2: Добавление CSS-класса для родительских пунктов меню
Чтобы легко стилизовать пункты меню с дочерними элементами, можно добавить им CSS-класс has-children
. Этот класс может помочь визуально выделить пункты меню с подменю.
add_filter( 'wp_nav_menu_objects', 'add_class_to_parent_menu_items' );
function add_class_to_parent_menu_items( $items ) {
// Получаем ID пунктов, имеющих дочерние элементы
$parent_ids = wp_list_pluck( $items, 'menu_item_parent' );
foreach ( $items as $item ) {
// Проверяем, является ли пункт родительским и добавляем CSS-класс
if ( in_array( $item->ID, $parent_ids ) ) {
$item->classes[] = 'has-children';
}
}
return $items;
}
Пример 3: Добавление класса активному элементу меню
Часто требуется выделить активный элемент меню (пункт, соответствующий текущей странице). В этом примере добавляется CSS-класс current-page-item
к активному пункту.
add_filter( 'wp_nav_menu_objects', 'add_class_to_current_menu_item' );
function add_class_to_current_menu_item( $items ) {
foreach ( $items as $item ) {
if ( $item->current ) {
$item->classes[] = 'current-page-item';
}
}
return $items;
}
Пример 4: Скрытие пункта меню для определенной роли пользователя
Этот пример показывает, как скрыть пункт меню «Панель управления» для пользователей с ролью «подписчик». Это полезно для ограничения доступа к определенным страницам на сайте.
add_filter( 'wp_nav_menu_objects', 'hide_menu_item_for_subscribers', 10, 2 );
function hide_menu_item_for_subscribers( $sorted_menu_items, $args ) {
foreach ( $sorted_menu_items as $index => $item ) {
// Скрываем пункт меню "Панель управления" для подписчиков
if ( $item->title == 'Панель управления' && current_user_can( 'subscriber' ) ) {
unset( $sorted_menu_items[ $index ] );
}
}
return $sorted_menu_items;
}
Пример 5: Добавление атрибута data-id
к элементам меню
Если требуется добавить дополнительные атрибуты к пунктам меню, например, идентификаторы, можно использовать следующий код. В этом примере каждому пункту меню добавляется атрибут data-id
, содержащий его уникальный ID.
add_filter( 'wp_nav_menu_objects', 'add_data_id_to_menu_items' );
function add_data_id_to_menu_items( $items ) {
foreach ( $items as $item ) {
$item->attr_title .= ' data-id="' . $item->ID . '"';
}
return $items;
}
Заключение
Хук wp_nav_menu_objects
дает широкий спектр возможностей для настройки меню в WordPress. С его помощью можно адаптировать видимость пунктов для различных групп пользователей, добавлять стили и атрибуты, создавая гибкие и динамичные меню.