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?

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' => '' 
    ) );
}
?>

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


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' ) ); 
}

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.