it-swarm.com.de

Wie überprüfe ich, ob ein Menü existiert?

Ich rufe gerade ein Navigationsmenü auf, das auf dem Titel der übergeordneten Seite basiert. Wenn die Seite keinen übergeordneten Titel hat, ist es ein eigener Titel.

global $post;
$page_title;

if ($post->post_parent) {
    $page_title = get_the_title($post->post_parent);
}  else {
    $page_title = get_the_title($post);
}

$sidebar_title = 'Sidebar - '.$page_title;
wp_nav_menu(array( 'menu' => $sidebar_title));

Anstatt zuerst nach einem Elternteil zu suchen, möchte ich zuerst prüfen, ob eine Seite ein eigenes Menü hat. Das habe ich geschrieben, aber es funktioniert nicht:

global $post;
$page_title = get_the_title($post);
$sidebar_title = 'Sidebar - '.$page_title;

if ( !wp_nav_menu(array( 'menu' => $sidebar_title, 'echo' => false )) ) {

    $page_title = get_the_title($post->post_parent);
    $sidebar_title = 'Sidebar - '.$page_title;
}

wp_nav_menu(array( 'menu' => $sidebar_title ));

TLDR: Wie überprüfe ich, ob ein Menü existiert?

3
justlemons

Angenommen, Sie haben benutzerdefinierte Navigationsmenüs ordnungsgemäß implementiert:

  1. Registrieren des Navigationsmenüs Themenstandorte:

    register_nav_menus( array(
        'parent_page' => "Parent Page",
        'page_a' => "Page A",
        'page_b' => "Page B", //etc
    ) );
    
  2. wp_nav_menu() richtig aufrufen:

    wp_nav_menu( array(
        'theme_location' => 'page_a'
    );
    

... dann können Sie mit der Bedingung has_nav_menu() bestimmen, ob einem Themenbereich ein Menü zugewiesen ist:

if ( has_nav_menu( 'page_a' ) ) {
    // do something
}

In Ihrem speziellen Fall könnten Sie so etwas tun:

if ( has_nav_menu( 'page_a' ) ) {
    wp_nav_menu( array( 'theme_location' => 'page_a' ) );
} else {
    wp_nav_menu( array( 'theme_location' => 'parent_page' ) );
}
5
Chip Bennett

Ich denke, ich mache eine ähnliche Sache wie das OP: Ich lasse meinen Client (WP-Admin-Benutzer) Menüs erstellen (in WP-Admin> Darstellung> Menüs), die NICHT einem bestimmten Themenort zugewiesen sind, da dies eine statische/Eins-zu-eins-Beziehung.

Stattdessen werden diese Menüs dynamisch (durch ein benutzerdefiniertes Widget) angezeigt, basierend auf dem Namen des Top-Vorfahren der aktuellen Seite. Wenn dieser Name mit dem Namen eines vorhandenen Menüs übereinstimmt, zeigen Sie das Menü an (umbrochen vom Standard-Widget vor/nach HTML). Wenn jedoch KEINE Übereinstimmung vorliegt, wird nichts ausgegeben.

Ich musste also überprüfen, ob das Menü vorhanden ist, bevor ich die Widget-Ausgabe startete.

$args = array(
    'menu' => $menu_name, // from top-ancestor of current page
    'echo' => 0,  // true or 0
    'theme_location' => '__fake', // fake value, to prevent display of 1st real menu
    'fallback_cb' => false  // prevent display of 1st real menu
);
$menu = wp_nav_menu( $args );
if ($menu){ 
    # output
    echo $before_widget; // Before
    echo $before_title . $title . $after_title; // Title
    echo $menu;  
    echo $after_widget; // After
}
0
tzeldin88