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;
}

Brigante
297
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.

Brigante
297
27 ene 2012 19:06:35
Preguntas relacionadas
1
respuestas