wp_nav_menu: pokaż menu tylko jeśli istnieje, w przeciwnym razie nic nie pokaż

11

Próbuję użyć wp_nav_menu, aby wyświetlić menu tylko wtedy, gdy istnieje, w przeciwnym razie nic nie wyświetlaj.

Jeśli usunę menu, wyświetli się lista stron.

Mój plik functions.php zawiera:

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

Jak mogę użyć wp_nav_menu, aby wyświetlić menu tylko wtedy, gdy istnieje, w przeciwnym razie nic nie pokazuj?

Ryan
źródło

Odpowiedzi:

19

Użyj has_nav_menu()i przetestuj theme_locationzamiast 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' => '' 
    ) );
}
?>

Możesz wyświetlać alternatywną treść, dodając elseklauzulę.

EDYTOWAĆ

Trzeba wymienić $theme_locationze swoją rzeczywistą 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
źródło
Chociaż nic nie wyświetla, jeśli nie ma menu, niestety robi to samo, gdy jest menu. Jakieś inne pomysły?
Ryan,
Czy zastosowałeś menu do określonej lokalizacji motywu?
Chip Bennett,
Nie, jak to zrobić?
Ryan,
1
Dashboard -> Appearance -> Menus. Utwórz i zapisz niestandardowe menu, a następnie zastosuj je do określonej lokalizacji motywu, korzystając z menu rozwijanego.
Chip Bennett
Ach tak, zrobiłem to (zrzut ekranu: bit.ly/vrjNf9 ). Niestety problem nadal występuje - menu nie pojawi się. PS Mój plik funkcji ma to: if (function_exists ('register_nav_menus')) {register_nav_menus (array ('main_nav' => 'Main Menu nawigacji'));}
Ryan
6

Możesz po prostu podać fałsz jako fallback_cbargument wp_nav_menu. Nic się nie pojawi - raczej wp_nav_menu zwróci false (nic nie echa).

<?php
wp_nav_menu(array( 
    'theme_location' => $main_nav, 
    'menu_class'     => 'nav', 
    'container'      => '',
    'fallback_cb'    => false
));
chrisguitarguy
źródło
0

Możesz najpierw zarejestrować menu bez określania lokalizacji.
W functions.php:

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

A kiedy wywołasz menu header.php, sprawdź has_nav_menu():

if ( has_nav_menu( 'header' ) ) {
    wp_nav_menu( array( 'theme_location' => 'header' ) ); 
}
Alex Chen
źródło
Jeśli zarejestrujesz menu bez lokalizacji motywu, nie możesz poprosić o to później z ograniczeniem lokalizacji motywu.
fuxia
0

Przeczytaj to:

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

ustaw 'fallback_cb' => false i żaden nie będzie wyświetlany, jest to standardowa metoda sugerowana przez wp facetów.

Hooman Askari
źródło
Jest to to samo, co odpowiedź chrisguitarguy ...
brasofilo
Wiem, chciałem tylko zwrócić uwagę na główny artykuł na temat kodeksu wordpress.
Hooman Askari,
Wydaje się, że to nieprawda. Dokumenty mówią: Jeśli nie podano parametru motyw_lokacji, funkcja wyświetla developer.wordpress.org/reference/functions/wp_nav_menu/... menu pasujące do identyfikatora, informacji o pracy lub nazwy podanej przez parametr menu; w przeciwnym razie pierwsze niepuste menu; w przeciwnym razie (lub jeśli menu podane przez menu jest puste), wyjście funkcji określonej przez parametr fallback_cb (domyślnie wp_page_menu ()); inaczej nic.
Alireza,