web-dev-qa-db-fra.com

Comment définir la limite uniquement aux niveaux supérieurs de wp_nav_menu?

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:

Example menu

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.

3
user30910

Selon le codex, il vous suffit d'utiliser depthparameter 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
        }
    }
?>
3
Simon

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.

0
Sormano

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.

0
Aaron Harun