Cómo limitar solo los niveles superiores en wp_nav_menu

3 abr 2013, 12:23:32
Vistas: 16.7K
Votos: 4

¿Cómo puedo establecer un límite solo para los elementos de nivel superior en wp_nav_menu?

Ejemplo:

Tengo este menú en mi panel de administración:

Ejemplo de menú

Me gustaría contar SOLO los elementos de nivel superior y mostrar un número limitado de ellos, digamos 5.

Así que no importa si tienes cientos de elementos de nivel superior en el panel de administración, solo debería mostrar 5.

Las subpáginas deberían mostrarse normalmente, sin ningún límite.

Busqué una respuesta aquí y en la web y vi esta respuesta pero el gran problema es que esa solución cuenta tanto los elementos de nivel superior como los subpáginas, y yo necesito contar solo los elementos principales.

Me gustaría ver alguna solución con una clase walker personalizada si es posible o con PHP en general, no con trucos y hacks de CSS y jQuery.

0
Todas las respuestas a la pregunta 3
1

Según el codex, solo necesitas usar el parámetro depth para mostrar solo las páginas de nivel superior:

<?php wp_nav_menu( array( 'location' => 'your_location', 'depth' => 1 ) ); ?>

Para más referencia, consulta este enlace.

También podrías solucionar ambos problemas usando [wp_get_nav_menu_items][2] y luego un bucle personalizado para analizar solo las páginas de primer nivel y nivel superior.

EDITADO*** Dediqué algún tiempo comenzando algo para ayudar, desafortunadamente no puedo terminarlo ahora mismo, y quizás podría hacerlo más elegante, pero esto podría ser un comienzo:

<?php 
    $menu_name = 'principal';
        if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
        $menu_test = wp_get_nav_menu_object( $locations[ $menu_name ] );
                    // OBTENEMOS LOS ELEMENTOS EN menu_order
        $menu_test_items = wp_get_nav_menu_items( $menu_test->term_id );
        $top_items = array();
                    // LOS RECORREMOS Y CREAMOS UN ARRAY ANIDADO COMO EL MENÚ
        foreach( $menu_test_items as $menu_test_item ) {
            if ( $menu_test_item->menu_item_parent == 0 ) {
                $top_items[$menu_test_item->ID][$menu_test_item->ID] = $menu_test_item;     
            } else {
                $top_items[$menu_test_item->menu_item_parent][$menu_test_item->ID] = $menu_test_item;
            }

        }
                    // ENTONCES PODRÍAMOS RECORRERLO x VECES Y SALIR
        foreach ( $top_items as $top_item ) {  
            // Ahora necesitas recorrer x veces
            // y mostrar $top_item con otro foreach
        }
    }
?>
3 abr 2013 13:30:39
Comentarios

gracias Simon, es cierto lo que dijiste sobre la profundidad y wp_get_nav_menu_items, pero lo que deseo lograr es mostrar tanto las páginas principales como las subpáginas, con un número limitado de páginas principales.

user30910 user30910
3 abr 2013 23:44:19
0

puedes intentar algo como:

function my_max_5_menu_items( $menu_items ) {

    return array_slice( $menu_items, 0, 5 );

}
add_filter( "wp_nav_menu_items", "my_max_5_menu_items" );

No he tenido oportunidad de probar esto.

9 mar 2014 15:55:32
0

Como referencia, Sormano iba por el camino correcto, pero el filtro pasa una cadena. La versión correcta sería:

function my_max_5_menu_items( $menu_items) {
    $menu_items = explode('</li>', $menu_items);

    $menu_items = array_slice( $menu_items, 0, 5 );

    return implode('</li>', $menu_items);
}
add_filter( "wp_nav_menu_items", "my_max_5_menu_items" );

Obviamente, esto solo funciona cuando también usas depth=1. Pero es una solución más simple que crear un walker personalizado si solo necesitas una solución sencilla.

18 feb 2016 20:25:45