Cómo excluir elementos de submenú en wp_get_nav_menu_items

27 ene 2012, 18:44:58
Vistas: 15K
Votos: 4

Tengo la siguiente función para mostrar un menú personalizado en formato select para un diseño responsivo en el que estoy trabajando.

Funciona exactamente como quiero, excepto que necesito excluir los elementos de submenú. Actualmente incluye todos los niveles.

¿Alguien sabe cómo puedo indicarle a wp_get_nav_menu_items que solo muestre los elementos del menú principal?

function jeMobileMenu( $args ) {

        // Establecer argumentos por defecto
        $defaults = array (
            'menuSlug'      =>  '',
            'placeholder'   =>  'Menú',
            'prefix'        =>  ' » ',
            'navID'         =>  'mobileNav',
            'navClass'      =>  ''
        );

        // Combinar argumentos recibidos con los valores por defecto
        $args = wp_parse_args( $args, $defaults );

        // Extraer cada item de $args como variable individual (ej. $menuSlug, $placeholder)
        extract( $args, EXTR_SKIP );

        // Si no se pasó un slug de menú, salir
        if ( empty($menuSlug) )
            return;

        // Si el slug pasado no corresponde a un menú existente, salir
        if ( !has_nav_menu( $menuSlug ) )
            return;

        $locations = get_nav_menu_locations();
        $menu = wp_get_nav_menu_object( $locations[ $menuSlug ] );

        $menu_items = wp_get_nav_menu_items($menu->term_id);

        // Envolver el select en un elemento nav con el ID y clases pasados
        $menu_output = '<nav id="' . $navID . '" class="' . $navClass . '">';

        $menu_output .= '<select id="menu-' . $menuSlug . '" onchange="window.open(this.options[this.selectedIndex].value,\'_top\')">';

        // Añadir placeholder y enlace a home
        $menu_output .= '<option value="">' . $placeholder . '</option>';
        $menu_output .= '<option value="' . home_url( '/' ) . '">' . $prefix . 'Inicio</option>';

        // Recorrer los elementos del menú y crear opciones en la lista select
        foreach ( (array) $menu_items as $key => $menu_item ) {
            // Solo mostrar elementos de nivel superior (menu_item_parent == 0)
            if($menu_item->menu_item_parent == 0) {
                $title = $menu_item->title;
                $url = $menu_item->url;
                $menu_output .= '<option value="' . $url . '">' . $prefix . $title . '</option>';
            }
        }
        $menu_output .= '</select>';

        $menu_output .= '</nav>';

        echo $menu_output;
    }
0
Todas las respuestas a la pregunta 1
2

¡Creo que lo resolví!

Hice un print_r en cada $menu_item y vi que hay una clave de array llamada menu_item_parent allí.

Así que cambié esto:

foreach ( (array) $menu_items as $key => $menu_item ) {
    $title = $menu_item->title;
    $url = $menu_item->url;
    $menu_output .= '<option value="' . $url . '">' . $prefix . $title . '</option>';
}

a esto:

foreach ( (array) $menu_items as $key => $menu_item ) {
    if ( $menu_item->menu_item_parent == 0 ) :
        $title = $menu_item->title;
        $url = $menu_item->url;
        $menu_output .= '<option value="' . $url . '">' . $prefix . $title . '</option>';
    endif;
}

Ahora solo mostrará los elementos de menú que no tienen un elemento padre.

27 ene 2012 19:06:35
Comentarios

Si esta es la solución, márcala como resuelta.

mor7ifer mor7ifer
27 ene 2012 19:13:48

No puedes marcar tus propias respuestas como solución hasta 2 días después de que se hizo la pregunta, pero lo haré entonces.

Brigante Brigante
27 ene 2012 19:35:04