wp_nav_menu: показать меню только если оно существует, иначе ничего не показывать
Я пытаюсь использовать wp_nav_menu так, чтобы меню отображалось только если оно существует, в противном случае ничего не должно выводиться.
Если я удаляю меню, то выводится список страниц.
Мой файл functions.php содержит:
if (function_exists('register_nav_menus')) {
register_nav_menus(
array('main_nav' => 'Главное навигационное меню'));}
Как можно использовать wp_nav_menu, чтобы меню отображалось только при его наличии, а в противном случае ничего не показывалось?
Используйте 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' => ''
) );
}
?>

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

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

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

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

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

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

Вы можете просто указать false в качестве аргумента fallback_cb
функции wp_nav_menu
. В этом случае ничего не будет отображаться — вместо этого функция вернёт false (не выводя ничего на экран).
<?php
wp_nav_menu(array(
'theme_location' => $main_nav,
'menu_class' => 'nav',
'container' => '',
'fallback_cb' => false
));

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

Вы можете сначала просто зарегистрировать меню без указания местоположения.
В 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' ) );
}

Прочтите это:
http://codex.wordpress.org/Function_Reference/wp_nav_menu
Установите 'fallback_cb' => false, и ничего не будет отображаться — это стандартный метод, рекомендуемый разработчиками WordPress.

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

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