Come impostare un limite solo ai livelli superiori di wp_nav_menu?

3 apr 2013, 12:23:32
Visualizzazioni: 16.7K
Voti: 4

Come posso impostare un limite agli elementi di menu di primo livello in wp_nav_menu?

Esempio:

Ho questo menu nel mio pannello di amministrazione:

Menu di esempio

Vorrei contare SOLO gli elementi di primo livello e visualizzarne un numero limitato, ad esempio 5.

Quindi, non importa se nel pannello di amministrazione hai centinaia di elementi di primo livello, dovrebbe visualizzarne solo 5.

Le sotto-pagine dovrebbero essere visualizzate normalmente, senza alcun limite.

Ho cercato una risposta qui e sul web e ho visto questa risposta ma il grosso problema è che questa soluzione conta sia gli elementi principali che le sotto-pagine insieme, mentre io ho bisogno di contare solo le pagine principali.

Vorrei vedere una soluzione con una classe walker personalizzata se possibile, o in PHP in generale e non con trucchi e hack CSS e jQuery.

0
Tutte le risposte alla domanda 3
1

Secondo il codex, è sufficiente utilizzare il parametro depth per visualizzare solo le pagine di primo livello:

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

Per ulteriori riferimenti, consulta questo.

Potresti anche risolvere entrambi i problemi utilizzando [wp_get_nav_menu_items][2] e poi implementando un loop personalizzato per analizzare solo le pagine di primo livello.

EDIT*** Ho dedicato del tempo per iniziare a sviluppare qualcosa che possa aiutare, purtroppo non posso completarlo adesso, e forse potrebbe essere reso più elegante, ma potrebbe essere un punto di partenza:

<?php 
    $menu_name = 'principal';
        if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
        $menu_test = wp_get_nav_menu_object( $locations[ $menu_name ] );
                    // OTTENIAMO GLI ELEMENTI IN ORDINE DI MENU
        $menu_test_items = wp_get_nav_menu_items( $menu_test->term_id );
        $top_items = array();
                    // LI CICLIAMO E CREIAMO UN ARRAY ANNIDATO COME IL MENU
        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;
            }

        }
                    // POI POTREMMO SEMPLICEMENTE CICLARLO x VOLTE E INTERROMPERE
        foreach ( $top_items as $top_item ) {  
            // Ora devi ciclare x volte
            // e visualizzare $top_item con un altro foreach
        }
    }
?>
3 apr 2013 13:30:39
Commenti

grazie Simon, è vero quello che hai detto riguardo alla profondità e wp_get_nav_menu_items, ma quello che vorrei ottenere è mostrare sia le pagine principali che quelle secondarie, con un numero limitato di pagine principali.

user30910 user30910
3 apr 2013 23:44:19
0

puoi provare qualcosa come:

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" );

Non ho avuto modo di testare questo codice.

9 mar 2014 15:55:32
0

Per riferimento, Sormano era sulla strada giusta, ma il filtro passa una stringa. La versione corretta sarebbe:

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" );

Ovviamente, questo funziona solo quando usi anche depth=1. Ma è una soluzione più semplice rispetto alla creazione di un customer walker se tutto ciò di cui hai bisogno è una soluzione semplice.

18 feb 2016 20:25:45