web-dev-qa-db-fra.com

Vérifier si un menu est vide?

J'ai des menus définis correspondant à un champ personnalisé sur une page. C'est-à-dire que j'ai menu1, menu2 et menu3 sur trois pages sous un champ personnalisé => Nom du menu. Sous functions.php j'ai:

/* Add Menu Locations */
add_action( 'init', 'register_my_menus' );
function register_my_menus() {
    register_nav_menus(
        array(
            'one-menu' => __('menu1'),
            'two-menu' => __('menu2'),
            'three-menu' => __('menu3'),
            'footerBlocka' => __('Footer Block 1'),
            'footerBlockb' => __('Footer Block 2'),
            'footerBlockc' => __('Footer Block 3'),
            'footerBlockd' => __('Footer Block 5')
        )
    );
}

Ensuite, dans mon modèle de page, j'ai:

<?php
    /* Division */
    wp_nav_menu(array(
        'menu' => get_post_meta( $post->ID, 'MenuName', true),
        'depth' => 2,
        'container' => false,
        'menu_class' => 'nav navbar-nav'
    ));
?>

Cela fonctionne très bien tant que a) le menu existe et b) le menu contient réellement des éléments de menu. Si le menu existe mais qu'il n'y a pas d'élément de menu, il affiche étrangement une liste de tous les éléments de menu de tous les menus du site. Si le menu n'existe pas, il affiche simplement le menu suivant répertorié dans functions.php.

Je pense donc que dans mon modèle de page, je dois vérifier le menu. S'il existe, imprimez-le. J'ai vu quelques autres exemples, mais tout ce que j'ai pu trouver, c'est si la région thématique existe ou s'il existe un menu. Puisque j'utilise 'menu' => get_post_meta( $post->ID, 'MenuName', true), pour appeler le menu de manière dynamique, je ne sais pas comment vérifier ce menu dynamique avant d'essayer d'imprimer le menu.

Alors, comment puis-je vérifier le menu appelé à partir de 'menu' => get_post_meta( $post->ID, 'MenuName', true), et s’il existe et contient des éléments de menu, puis l’imprimer, sinon, rien n’est imprimé?

EDIT: j'ai essayé ce qui suit:

<?php
    /* Division */
    wp_nav_menu(array(
        'menu' => get_post_meta( $post->ID, 'MenuName', true),
        'depth' => 2,
        'fallback_cb' => false,
        'container' => false,
        'menu_class' => 'nav navbar-nav'
    ));
?>

Cette nouvelle addition rendra toujours le menu suivant en ligne à partir de la fonction functions.php. Donc, si menu3 n'existe pas, il imprime le menu footerBlocka. Je pense que mon objectif est de vérifier l'ID de la page pour le champ personnalisé NomMenu, s'il existe, puis de vérifier si le menu existe et qu'il contient des liens, si vrai, puis imprimer le menu, sinon, ne rien faire. Quelque chose comme:

$menu = get_post_meta($post->ID, 'MenuName');
if($menu){
  if([wp_nav_menu == $menu AND has links]){
      wp_nav_menu(array(...));
  }
}

C'est le pseudo-code qui, à mon avis, serait nécessaire, mais je ne connais pas suffisamment les hooks WordPress pour savoir ce dont il a besoin.

4
o_O

wp_nav_menu a l'argument fallback_cb, qui est la fonction appelée si un menu n'existe pas. Ceci est défini par défaut sur wp_page_menu. C'est pourquoi vous voyez une liste de pages si le menu n'existe pas. Si vous définissez explicitement cela sur false, rien ne sera affiché si le menu n'existe pas.

MODIFIER-

Étant donné un nom de menu, vous pouvez charger l'objet de menu avec wp_get_nav_menu_object . Cela vous dira s'il existe, quel est son identifiant (à passer comme argument menu) et combien d'éléments de menu il a.

$menu_name = get_post_meta( $post->ID, 'MenuName', true );
$menu = wp_get_nav_menu_object( $menu_name );
if( is_object( $menu ) ){
    echo 'This menu exists!';
    echo 'This menu has ' . $menu->count . ' menu items.';
    echo 'This menu ID is ' . $menu->term_id . '.';
} else {
    echo 'A menu with that name doesn\'t exist';
}
4
Milo