¿Comprobar si un menú está vacío?

4

Tengo conjuntos de menús correspondientes a un campo personalizado en una página. Es decir, tengo menu1, menu2 y menu3 en tres páginas en el campo personalizado = > MenuName. Bajo functions.php tengo:

/* 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')
        )
    );
}

Luego en mi plantilla de página tengo:

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

Esto funciona bien siempre y cuando a) el menú exista yb) el menú realmente contenga elementos del menú. Si el menú existe pero no hay elementos de menú, se muestra de forma extraña una lista de todos los elementos de menú de todos los menús del sitio. Si el menú no existe, solo muestra el siguiente menú listado en functions.php.

Así que creo que en la plantilla de mi página necesito verificar el menú y, si existe, imprimir el menú. He visto un par de otros ejemplos, pero todo lo que pude encontrar fue si existe la región del tema o si existe un menú. Ya que estoy usando 'menu' => get_post_meta( $post->ID, 'MenuName', true), para llamar al menú dinámicamente, no sé cómo revisar este menú dinámico antes de intentar imprimir el menú.

Entonces, ¿cómo verifico el menú al que se llama desde 'menu' => get_post_meta( $post->ID, 'MenuName', true), y si existe y tiene elementos de menú, luego lo imprimo, si no, no imprime nada?

EDITAR: he intentado lo siguiente:

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

Esta nueva adición aún mostrará el siguiente menú en línea desde la función functions.php. Entonces, si menu3 no existe, imprime el menú footerBlocka. Estoy pensando que mi objetivo es verificar el ID de página para el campo personalizado Nombre de Menú, si existe, luego verificar si el menú existe y si tiene enlaces, si es verdadero, luego imprimir el menú, de lo contrario no hacer nada. Algo como:

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

Ese es el pseudo código que creo que sería necesario, pero no sé lo suficiente sobre los ganchos de WordPress para saber qué debe ser.

    
pregunta o_O 05.11.2015 - 04:57

1 respuesta

4

wp_nav_menu tiene el argumento fallback_cb , que es la función llamada si no existe un menú. Esto se establece en wp_page_menu de forma predeterminada, por lo que verá una lista de páginas si el menú no existe. Si lo establece explícitamente en false , no se generará nada si el menú no existe.

EDITAR

Dado un nombre de menú, puede cargar el objeto de menú con wp_get_nav_menu_object . Esto le dirá si existe, cuál es su ID (para pasar como argumento menu ) y cuántos elementos de menú tiene.

$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';
}
    
respondido por el Milo 05.11.2015 - 05:04

Lea otras preguntas en las etiquetas