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

11

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

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

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

if (function_exists('register_nav_menus')) {
register_nav_menus (
array('main_nav' => 'Main Navigation Menu'));}

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

Райан
источник

Ответы:

19

Используйте has_nav_menu()и тестируйте theme_location, а не menu_id:

<?php
if ( has_nav_menu( $theme_location ) ) {
    // User has assigned menu to this location;
    // output it
    wp_nav_menu( array( 
        'theme_location' => $theme_location, 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>

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

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

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

<?php
if ( has_nav_menu( 'main_nav' ) ) {
    // User has assigned menu to this location;
    // output it
    wp_nav_menu( array( 
        'theme_location' => 'main_nav', 
        'menu_class' => 'nav', 
        'container' => '' 
    ) );
}
?>
Чип Беннетт
источник
Хотя это не выводит ничего , если нет меню, это , к сожалению , делает то же самое , когда это меню. Есть еще идеи?
Райан
Вы применили меню к указанному местоположению темы?
Чип Беннетт
Нет, как мне это сделать?
Райан
1
Dashboard -> Appearance -> Menus, Создайте и сохраните пользовательское меню, затем примените его к указанному местоположению темы, используя раскрывающееся меню.
Чип Беннетт
Ах да, я сделал это (скриншот: bit.ly/vrjNf9 ). К сожалению, проблема все еще сохраняется - меню не появится. PS Мой файл функций имеет следующее: if (function_exists ('register_nav_menus')) {register_nav_menus (array ('main_nav' => 'Главное меню навигации'));}
Райан
6

Вы можете просто указать false в качестве fallback_cbаргумента wp_nav_menu. Ничего не будет отображаться - скорее, wp_nav_menu вернет false (ничего не повторяя).

<?php
wp_nav_menu(array( 
    'theme_location' => $main_nav, 
    'menu_class'     => 'nav', 
    'container'      => '',
    'fallback_cb'    => false
));
chrisguitarguy
источник
0

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

add_action( 'init', 'register_my_menus' );
function register_my_menus() {  
    register_nav_menus(
        array(
            'header' => __( 'Header Menu' )
        )
    );
}

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

if ( has_nav_menu( 'header' ) ) {
    wp_nav_menu( array( 'theme_location' => 'header' ) ); 
}
Алекс Чен
источник
Если вы зарегистрируете меню без местоположения темы, вы не сможете запросить его позже с ограничением местоположения темы.
Fuxia
0

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

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

установите 'fallback_cb' => false, и ни один из них не будет отображаться, это стандартный метод, предложенный парнями из wp.

Хуман Аскари
источник
Это так же, как chrisguitarguy ответ ...
brasofilo
Я знаю, я просто хотел показать вам основную статью о WordPress Codex.
Хуман Аскари
Кажется, что это не так. В документации сказано: Если не указан параметр theme_location, функция отображает developer.wordpress.org/reference/functions/wp_nav_menu/… меню, соответствующее идентификатору, слагу или имени, заданному параметром menu; в противном случае первое непустое меню; в противном случае (или если меню, заданное в menu, пусто), вывод функции, заданной параметром fallback_cb (по умолчанию wp_page_menu ()); иначе ничего.
Алиреза