wp_nav_menu: mostra o menu apenas se existir, caso contrário não mostra nada

11

Estou tentando usar wp_nav_menu para exibir apenas um menu se existir, caso contrário, não exibir nada.

Se eu excluir o menu, ele exibirá uma lista das páginas.

Meu arquivo functions.php contém:

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

Como posso usar wp_nav_menu para exibir apenas um menu se houver algum, caso contrário não mostrar nada?

Ryan
fonte

Respostas:

19

Use has_nav_menu()e teste para theme_location, em vez de 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' => '' 
    ) );
}
?>

Você pode gerar conteúdo alternativo adicionando uma elsecláusula.

EDITAR

Você precisa substituir $theme_locationpelo seu real 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' => '' 
    ) );
}
?>
Chip Bennett
fonte
Enquanto isso gera nada se não há nenhum menu, infelizmente, faz o mesmo quando não é um menu. Alguma outra ideia?
Ryan
Você aplicou um menu ao local do tema especificado?
Chip Bennett
Não, como faço isso?
Ryan
11
Dashboard -> Appearance -> Menus. Crie e salve um menu personalizado e aplique-o ao local do tema especificado, usando o menu suspenso.
Chip Bennett
Ah sim, eu tinha feito isso (captura de tela: bit.ly/vrjNf9 ). Infelizmente, o problema ainda persiste - o menu não aparece. PS Meu arquivo funções tem esta: if (function_exists ( 'register_nav_menus')) {register_nav_menus (array ( 'main_nav' 'Menu Principal de Navegação' =>));}
Ryan
6

Você pode apenas especificar false como o fallback_cbargumento de wp_nav_menu. Nada será exibido - em vez disso, wp_nav_menu retornará false (ecoando nada).

<?php
wp_nav_menu(array( 
    'theme_location' => $main_nav, 
    'menu_class'     => 'nav', 
    'container'      => '',
    'fallback_cb'    => false
));
chrisguitarguy
fonte
0

Você pode apenas registrar o menu primeiro sem especificar a localização.
Em functions.php:

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

E quando você chamar o menu header.php, verifique com has_nav_menu():

if ( has_nav_menu( 'header' ) ) {
    wp_nav_menu( array( 'theme_location' => 'header' ) ); 
}
Alex Chen
fonte
Se você registrar um menu sem um local de tema, não poderá solicitá-lo mais tarde com uma restrição de local de tema.
fuxia
0

Leia isso:

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

set 'fallback_cb' => false e nenhum será exibido, este é o método padrão sugerido pelos caras do wp.

Hooman Askari
fonte
Este é o mesmo que resposta chrisguitarguy ...
brasofilo
Eu sei, eu só queria apontar o artigo principal sobre o codex wordpress.
22613 Hooman Askari #
Parece que não é verdade. Os documentos dizem: Se não for fornecido um parâmetro de theme_location, a função exibirá developer.wordpress.org/reference/functions/wp_nav_menu/… o menu correspondente ao ID, slug ou nome fornecido pelo parâmetro de menu; caso contrário, o primeiro menu não vazio; caso contrário (ou se o menu fornecido pelo menu estiver vazio), saída da função fornecida pelo parâmetro fallback_cb (wp_page_menu (), por padrão); caso contrário, nada.
Alireza