Verifique se um menu está vazio?

4

Eu tenho um conjunto de menus correspondente a um campo personalizado em uma página. Ou seja, eu tenho menu1, menu2 e menu3 em três páginas sob o campo personalizado = > MenuName. Em functions.php eu tenho:

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

Em seguida, no meu modelo de página, tenho:

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

Isso funciona muito bem desde que a) o menu exista e b) o menu realmente contenha itens de menu. Se o menu existir, mas não houver itens de menu, ele exibirá estranhamente uma lista de todos os itens de menu de todos os menus do site. Se o menu não existir, apenas mostrará o próximo menu listado em functions.php.

Então eu acho que no meu modelo de página eu preciso verificar o menu e, se existir, imprima o menu. Eu tenho visto alguns outros exemplos, mas tudo o que consegui encontrar foi se a região do tema existe ou existe um menu. Como estou usando 'menu' => get_post_meta( $post->ID, 'MenuName', true), para chamar o menu dinamicamente, não sei como verificar esse menu dinâmico antes de tentar imprimir o menu.

Então, como eu verifico o menu que é chamado de 'menu' => get_post_meta( $post->ID, 'MenuName', true), e se ele existe e tem itens de menu, imprima-o, se não, imprima nada?

EDIT: eu tentei o seguinte:

<?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 nova adição ainda renderizará o próximo menu na linha da função functions.php. Portanto, se o menu3 não existir, ele imprime o menu footerBlocka. Estou pensando meu objetivo é verificar o ID da página para o campo personalizado MenuName, se existir, em seguida, verifique se o menu existe e tem links, se for verdade, em seguida, imprima menu, mais nada fazer. Algo como:

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

Esse é o pseudo código que eu acho que seria necessário, mas eu não sei o suficiente sobre os ganchos do WordPress para saber o que ele precisa ser.

    
por o_O 05.11.2015 / 04:57

1 resposta

4

wp_nav_menu tem o argumento fallback_cb , que é a função chamada se um menu não existir. Isso é definido como wp_page_menu por padrão, e é por isso que você vê uma lista de páginas se o menu não existir. Se você definir isso explicitamente como false , nada será produzido se o menu não existir.

EDITAR

Dado um nome de menu, você pode carregar o objeto de menu com wp_get_nav_menu_object . Isto irá dizer-lhe se existe, qual é o seu ID (para passar como menu argumento), e quantos itens de menu ele tem.

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