wp_nav_menu: показать меню только если оно существует, иначе ничего не показывать

2 нояб. 2011 г., 21:48:43
Просмотры: 20.9K
Голосов: 14

Я пытаюсь использовать wp_nav_menu так, чтобы меню отображалось только если оно существует, в противном случае ничего не должно выводиться.

Если я удаляю меню, то выводится список страниц.

Мой файл functions.php содержит:

if (function_exists('register_nav_menus')) {
register_nav_menus(
array('main_nav' => 'Главное навигационное меню'));}

Как можно использовать wp_nav_menu, чтобы меню отображалось только при его наличии, а в противном случае ничего не показывалось?

0
Все ответы на вопрос 4
9
24

Используйте has_nav_menu() и проверяйте theme_location вместо menu_id:

<?php
if ( has_nav_menu( $theme_location ) ) {
    // Пользователь назначил меню для этого места;
    // выводим его
    wp_nav_menu( array( 
        'theme_location' => $theme_location, 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>

Вы можете вывести альтернативное содержимое, добавив условие else.

РЕДАКТИРОВАНИЕ

Вам нужно заменить $theme_location на ваш фактический theme_location:

<?php
if ( has_nav_menu( 'main_nav' ) ) {
    // Пользователь назначил меню для этого места;
    // выводим его
    wp_nav_menu( array( 
        'theme_location' => 'main_nav', 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>
2 нояб. 2011 г. 21:59:00
Комментарии

Хотя это ничего не выводит, если меню отсутствует, к сожалению, происходит то же самое, когда меню есть. Есть другие идеи?

Ryan Ryan
2 нояб. 2011 г. 23:23:03

Вы назначили меню для указанного места в теме?

Chip Bennett Chip Bennett
2 нояб. 2011 г. 23:28:52

Нет, как это сделать?

Ryan Ryan
2 нояб. 2011 г. 23:32:57

Dashboard -> Внешний вид -> Меню. Создайте и сохраните пользовательское меню, затем примените его к указанному местоположению в теме, используя выпадающее меню.

Chip Bennett Chip Bennett
2 нояб. 2011 г. 23:34:23

Ах да, я это сделал (скриншот: http://bit.ly/vrjNf9). К сожалению, проблема сохраняется - меню не отображается. P.S. В моем файле functions.php есть это: if (function_exists('register_nav_menus')) { register_nav_menus ( array('main_nav' => 'Главное навигационное меню'));}

Ryan Ryan
2 нояб. 2011 г. 23:37:25

Можете обновить ваш вопрос, добавив текущий вывод вашего кода?

Chip Bennett Chip Bennett
2 нояб. 2011 г. 23:40:22

Смотрите обновленный ответ; если вы восприняли мою сокращенную запись слишком буквально, я уточнил массив аргументов для вызова wp_nav_menu(). :)

Chip Bennett Chip Bennett
2 нояб. 2011 г. 23:41:54

Я обновил вопрос с вашим обновленным кодом, но меню по-прежнему не выводится (не выводится вообще никакой HTML). Что еще можно попробовать?

Ryan Ryan
2 нояб. 2011 г. 23:46:17

Вам нужно использовать фактическое расположение в теме, например main_nav, а не переменную-заполнитель $theme_location. Смотрите обновленный ответ.

Chip Bennett Chip Bennett
2 нояб. 2011 г. 23:51:14
Показать остальные 4 комментариев
2

Вы можете просто указать false в качестве аргумента fallback_cb функции wp_nav_menu. В этом случае ничего не будет отображаться — вместо этого функция вернёт false (не выводя ничего на экран).

<?php
wp_nav_menu(array( 
    'theme_location' => $main_nav, 
    'menu_class'     => 'nav', 
    'container'      => '',
    'fallback_cb'    => false
));
3 нояб. 2011 г. 00:06:56
Комментарии

Похоже, что нет: https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information

Alireza Alireza
6 нояб. 2018 г. 16:48:51

Это спасло мне жизнь! Ах, это сводило меня с ума :)

Omid Ariyan Omid Ariyan
22 янв. 2021 г. 13:37:33
1

Вы можете сначала просто зарегистрировать меню без указания местоположения.
В functions.php:

add_action( 'init', 'register_my_menus' );
function register_my_menus() {  
    register_nav_menus(
        array(
            'header' => __( 'Меню в шапке' )
        )
    );
}

И когда вы вызываете меню в header.php, проверьте с помощью has_nav_menu():

if ( has_nav_menu( 'header' ) ) {
    wp_nav_menu( array( 'theme_location' => 'header' ) ); 
}
27 нояб. 2012 г. 01:30:20
Комментарии

Если вы регистрируете меню без привязки к месту в теме, вы не сможете запросить его позже с ограничением по месту в теме.

fuxia fuxia
27 нояб. 2012 г. 06:33:40
3

Прочтите это:

http://codex.wordpress.org/Function_Reference/wp_nav_menu

Установите 'fallback_cb' => false, и ничего не будет отображаться — это стандартный метод, рекомендуемый разработчиками WordPress.

6 окт. 2013 г. 14:20:04
Комментарии

Это то же самое, что и ответ chrisguitarguy...

brasofilo brasofilo
6 окт. 2013 г. 16:02:47

Я знаю, просто хотел указать вам на основную статью в WordPress Codex.

Hooman Askari Hooman Askari
10 окт. 2013 г. 17:34:51

Похоже, это не так. В документации сказано:

Если параметр theme_location не указан, функция выводит https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information меню, соответствующее ID, слагу или имени, указанному в параметре menu; в противном случае первое непустое меню; в противном случае (или если меню, указанное параметром menu, пусто), выводится результат функции, заданной параметром fallback_cb (по умолчанию wp_page_menu()); в противном случае ничего не выводится.

Alireza Alireza
6 нояб. 2018 г. 16:46:53