wp_nav_menu: Menü nur anzeigen, wenn eines vorhanden ist, andernfalls nichts anzeigen

11

Ich versuche, wp_nav_menu zu verwenden, um ein Menü nur anzuzeigen, wenn eines vorhanden ist, andernfalls wird nichts angezeigt.

Wenn ich das Menü lösche, wird eine Liste der Seiten ausgegeben.

Meine Datei functions.php enthält:

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

Wie kann ich mit wp_nav_menu nur ein Menü anzeigen, wenn eines vorhanden ist, andernfalls nichts anzeigen?

Ryan
quelle

Antworten:

19

Verwenden has_nav_menu()und testen Sie theme_locationstatt 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' => '' 
    ) );
}
?>

Sie können alternativen Inhalt ausgeben, indem Sie eine elseKlausel hinzufügen .

BEARBEITEN

Sie müssen durch $theme_locationIhre tatsächliche ersetzen 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
quelle
Während dies nichts gibt , wenn es keine Speisekarte, hat es leider das gleiche , wenn es ist ein Menü. Irgendwelche anderen Ideen?
Ryan
Haben Sie ein Menü auf den angegebenen Themenort angewendet?
Chip Bennett
Nein, wie mache ich das?
Ryan
1
Dashboard -> Appearance -> Menus. Erstellen und speichern Sie ein benutzerdefiniertes Menü und wenden Sie es dann über das Dropdown-Menü auf den angegebenen Themenort an.
Chip Bennett
Ah ja, das hatte ich getan (Screenshot: bit.ly/vrjNf9 ). Leider besteht das Problem weiterhin - das Menü wird nicht angezeigt. PS Meine Funktionsdatei enthält Folgendes: if (function_exists ('register_nav_menus')) {register_nav_menus (array ('main_nav' => 'Hauptnavigationsmenü'));}
Ryan
6

Sie können einfach false als fallback_cbArgument von angeben wp_nav_menu. Es wird nichts angezeigt - vielmehr gibt wp_nav_menu false zurück (es wird nichts ausgegeben).

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

Sie können das Menü einfach zuerst registrieren, ohne den Ort anzugeben.
In functions.php:

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

Und wenn Sie das Menü aufrufen header.php, überprüfen Sie mit has_nav_menu():

if ( has_nav_menu( 'header' ) ) {
    wp_nav_menu( array( 'theme_location' => 'header' ) ); 
}
Alex Chen
quelle
Wenn Sie ein Menü ohne Themenort registrieren , können Sie es später nicht mit einer Einschränkung des Themenorts anfordern.
Fuxia
0

Lesen Sie dies:

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

setze 'fallback_cb' => false und es wird keine angezeigt. Dies ist die Standardmethode, die von wp-Leuten vorgeschlagen wird.

Hooman Askari
quelle
Dies ist das gleiche wie chrisguitarguy Antwort ...
brasofilo
Ich weiß, ich wollte Sie nur auf den Hauptartikel über WordPress-Codex hinweisen.
Hooman Askari
Es scheint, dass es nicht wahr ist. In den Dokumenten heißt es: Wenn kein Parameter theme_location angegeben ist, zeigt die Funktion developer.wordpress.org/reference/functions/wp_nav_menu/… das Menü an, das der ID, dem Slug oder dem Namen des Menüparameters entspricht. Andernfalls wird das erste nicht leere Menü angezeigt. Andernfalls (oder wenn das von menu angegebene Menü leer ist) wird die vom Parameter fallback_cb angegebene Funktion ausgegeben (standardmäßig wp_page_menu ()). sonst nichts.
Alireza