Хук pre_wp_nav_menu
в WordPress позволяет прервать стандартный вывод функции wp_nav_menu()
и заменить его альтернативным HTML-кодом или полностью изменить логику формирования меню на начальном этапе. Это удобно, когда необходимо кастомизировать меню, например, на основе условий или создать специальные меню для разных типов пользователей.
apply_filters( 'pre_wp_nav_menu', string|null $output, stdClass $args );
Данный фильтр используется для модификации или замены вывода функции wp_nav_menu()
до начала формирования меню. Возвращая любое значение, отличное от null
, можно «прекратить» работу wp_nav_menu()
и вывести переданный HTML-код вместо стандартного.
Параметры
$output
(строка|null): Опциональный HTML-код, который можно использовать для подмены стандартного вывода меню. По умолчанию:null
.$args
(stdClass): Объект с параметрамиwp_nav_menu()
.
Пример 1: Создание кастомного меню для авторизованных пользователей
В этом примере создаются два меню: одно для всех пользователей, и другое — для авторизованных. Меню для авторизованных будет отображаться, если пользователь вошел в систему.
// В файле header.php вызываем стандартное меню
wp_nav_menu( [
'theme_location' => 'main-menu',
] );
// Регистрируем оба меню в файле functions.php
add_action( 'after_setup_theme', 'register_custom_menus' );
function register_custom_menus() {
register_nav_menus( [
'main-menu' => 'Основное меню',
'logged-in-menu' => 'Меню для авторизованных',
] );
}
add_filter( 'pre_wp_nav_menu', 'custom_menu_for_logged_in_users', 10, 2 );
function custom_menu_for_logged_in_users( $output, $args ) {
// Проверка на основное меню и статус авторизации
if ( $args->theme_location === 'main-menu' && is_user_logged_in() ) {
// Возвращаем HTML-код меню для авторизованных
return wp_nav_menu( [
'theme_location' => 'logged-in-menu',
'echo' => false, // Отключаем вывод, чтобы вернуть как строку
] );
}
return $output;
}
Пример 2: Замена меню на кастомное сообщение для неавторизованных пользователей
Этот пример заменяет вывод меню на кастомное сообщение для гостей, предлагая им войти в систему для доступа к меню.
add_filter( 'pre_wp_nav_menu', 'display_message_for_guests', 10, 2 );
function display_message_for_guests( $output, $args ) {
if ( !is_user_logged_in() && $args->theme_location === 'sidebar-menu' ) {
return '<p class="guest-message">Пожалуйста, войдите, чтобы увидеть меню</p>';
}
return $output;
}
Пример 3: Замена меню на HTML-код с кнопкой для мобильных устройств
В следующем примере меню заменяется на кнопку для мобильных устройств, а на больших экранах показывается обычное меню.
add_filter( 'pre_wp_nav_menu', 'replace_menu_with_button_on_mobile', 10, 2 );
function replace_menu_with_button_on_mobile( $output, $args ) {
if ( wp_is_mobile() && $args->theme_location === 'footer-menu' ) {
return '<button class="mobile-menu-toggle">Открыть меню</button>';
}
return $output;
}
Пример 4: Вывод кастомного HTML для конкретного местоположения меню
В этом примере для меню, назначенного в позиции secondary-menu
, используется особый HTML-код, например, рекламный блок или информационное сообщение.
add_filter( 'pre_wp_nav_menu', 'custom_html_for_secondary_menu', 10, 2 );
function custom_html_for_secondary_menu( $output, $args ) {
if ( $args->theme_location === 'secondary-menu' ) {
return '<div class="custom-ad-banner">Рекламное сообщение</div>';
}
return $output;
}
Пример 5: Добавление кода предупреждения для определенной роли пользователя
Этот пример добавляет предупреждающее сообщение перед выводом меню для пользователей с ролью «Editor».
add_filter( 'pre_wp_nav_menu', 'warning_for_editors_in_menu', 10, 2 );
function warning_for_editors_in_menu( $output, $args ) {
if ( current_user_can('editor') && $args->theme_location === 'editor-menu' ) {
return '<p class="editor-warning">Вы вошли как редактор. Некоторые функции ограничены.</p>' . $output;
}
return $output;
}
Заключение
Хук pre_wp_nav_menu
дает гибкость и контроль над выводом меню, позволяя динамически модифицировать его или подменять альтернативными HTML-блоками до рендеринга. Надеемся, что эти примеры помогут вам эффективно использовать этот хук для создания настраиваемых меню в WordPress.