Come impostare un limite solo ai livelli superiori di wp_nav_menu?
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:
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.

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

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.
