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' => ''
) );
}
?>
Хотя это ничего не выводит, если меню отсутствует, к сожалению, происходит то же самое, когда меню есть. Есть другие идеи?
Ryan
Dashboard -> Внешний вид -> Меню. Создайте и сохраните пользовательское меню, затем примените его к указанному местоположению в теме, используя выпадающее меню.
Chip Bennett
Ах да, я это сделал (скриншот: http://bit.ly/vrjNf9). К сожалению, проблема сохраняется - меню не отображается. P.S. В моем файле functions.php есть это: if (function_exists('register_nav_menus')) { register_nav_menus ( array('main_nav' => 'Главное навигационное меню'));}
Ryan
Можете обновить ваш вопрос, добавив текущий вывод вашего кода?
Chip Bennett
Смотрите обновленный ответ; если вы восприняли мою сокращенную запись слишком буквально, я уточнил массив аргументов для вызова wp_nav_menu(). :)
Chip Bennett
Я обновил вопрос с вашим обновленным кодом, но меню по-прежнему не выводится (не выводится вообще никакой HTML). Что еще можно попробовать?
Ryan
Вы можете просто указать 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
Alireza
Вы можете сначала просто зарегистрировать меню без указания местоположения.
В 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.
Hooman Askari
Похоже, это не так. В документации сказано:
Если параметр theme_location не указан, функция выводит https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information меню, соответствующее ID, слагу или имени, указанному в параметре menu; в противном случае первое непустое меню; в противном случае (или если меню, указанное параметром menu, пусто), выводится результат функции, заданной параметром fallback_cb (по умолчанию wp_page_menu()); в противном случае ничего не выводится.
Alireza