Comment définir une limite pour les éléments de menu top level dans wp_nav_menu
?
Exemple:
J'ai ce menu dans mon tableau de bord admin:
Je souhaite compterUNIQUEMENTles éléments de niveau supérieur et en afficher un nombre limité, par exemple 5.
Donc, peu importe si vous êtes dans le tableau de bord de l'administrateur et que vous avez une centaine de niveaux supérieurs, il ne devrait en afficher que 5.
Les sous-pages doivent également être affichées, normalement, sans aucune limite.
J'ai cherché une réponse ici et sur le Web et j'ai vu cette réponse mais le gros problème est que cette solution compte les pages du haut et des sous-pages et que je n'ai besoin de compter que les pages du haut.
Je voudrais voir une solution avec un classe de randonneur personnalisé si possible ou PHP en général et non avec des astuces et des hacks CSS et jQuery.
Selon le codex, il vous suffit d'utiliser depth
parameter pour afficher uniquement les pages de niveau supérieur:
<?php wp_nav_menu( array( 'location' => 'your_location', 'depth' => 1 ) ); ?>
Pour plus de références, voir this .
Vous pouvez également résoudre votre problème en utilisant [wp_get_nav_menu_items][2]
, puis en utilisant une boucle personnalisée pour analyser uniquement les pages de premier niveau et de niveau supérieur.
EDIT *** J'ai passé quelque temps à créer quelque chose pour aider. Malheureusement, je ne peux pas le terminer pour le moment, et je pourrais peut-être le rendre plus élégant, mais cela pourrait être un début:
<?php
$menu_name = 'principal';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
$menu_test = wp_get_nav_menu_object( $locations[ $menu_name ] );
// WE GET THE ITEMS IN menu_order
$menu_test_items = wp_get_nav_menu_items( $menu_test->term_id );
$top_items = array();
// LOOP THEM AND CREATE NESTED ARRAY LIKE THE 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;
}
}
// THEN WE COULD JUST LOOP IT x TIMES AND BREAK
foreach ( $top_items as $top_item ) {
// Npw you need to loop x times
// and display $top_item with another foreach
}
}
?>
vous pouvez essayer quelque chose comme:
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" );
Je n'ai pas eu la chance de tester cela.
Pour référence, Sormano était sur le bon chemin, mais le filtre passe une chaîne. La version correcte serait:
function my_max_5_menu_items( $menu_items)
{
$menu_items = explode('</li>', $menu_items);
$menu_items = array_slice( $menu_items, 0, 3 );
return implode('</li>', $menu_items);
}
add_filter( "wp_nav_menu_items", "my_max_5_menu_items" );
Évidemment, cela ne fonctionne que si vous utilisez également depth=1
. Mais il est plus simple de créer un client en marchant si vous avez simplement besoin d’une solution simple.