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?
En supposant que les menus de navigation personnalisés soient correctement implémentés:
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
) );
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' ) );
}
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
}