web-dev-qa-db-fra.com

Comment vérifier si un menu existe?

Je suis en train de récupérer un menu de navigation basé sur le titre de la page parent, et si la page n'a pas de parent, c'est son propre titre.

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

Au lieu de chercher d’abord un parent, je voudrais d’abord vérifier si une page a son propre menu unique. C'est ce que j'ai écrit mais ça ne marche pas:

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: Comment vérifier si un menu existe?

3
justlemons

En supposant que les menus de navigation personnalisés soient correctement implémentés:

  1. Enregistrement du menu de navigation Lieux thématiques:

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

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

... alors vous pouvez utiliser la has_nav_menu() conditionnelle pour déterminer si un menu de lieu est attribué à un thème:

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

Dans votre cas spécifique, vous pourriez faire quelque chose comme ceci:

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

Je pense que je fais la même chose que l'OP: laisser mon client (utilisateur d'administrateur wp) créer des menus (dans WP-Admin> Apparence> Menus), qui ne sont PAS affectés à un emplacement de thème spécifique, car cela nécessite un paramètre statique. relation un à un.

Au lieu de cela, ces menus sont affichés dynamiquement (par un widget personnalisé), en fonction du nom de l'ancêtre supérieur de la page en cours. Si ce nom correspond à un nom de menu existant, affichez le menu (entouré par le widget standard avant/après html). Mais, s'il n'y a pas de correspondance, rien ne sort.

Je devais donc vérifier si le menu existait avant de lancer la sortie du widget.

$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