wake-up-neo.com

Wie setze ich ein Limit nur für die obersten Ebenen von wp_nav_menu?

Wie kann ich ein Limit für die Top Level Menüelemente in wp_nav_menu festlegen?

Beispiel:

Ich habe dieses Menü in meinem Admin-Dashboard:

Example menu

Ich möchteNURdie Elemente der obersten Ebene zählen und eine begrenzte Anzahl davon anzeigen, sagen wir 5.

Unabhängig davon, ob Sie sich im Administrator-Dashboard befinden und über 100 Top-Levels verfügen, sollte nur 5 angezeigt werden.

Die Unterseiten sollten normalerweise ebenfalls ohne Einschränkung angezeigt werden.

Ich habe hier und im Internet nach einer Antwort gesucht und sah diese Antwort , aber das große Problem ist, dass diese Lösung die oberen und unteren Seiten zusammenzählt und ich nur die oberen Seiten zählen muss.

Ich würde gerne eine Lösung mit einer benutzerdefinierten Walker-Klasse sehen, wenn möglich oder PHP im Allgemeinen und nicht mit CSS und jQuery-Tricks und -Hacks.

3
user30910

Entsprechend dem Codex müssen Sie nur depthparameter verwenden, um nur Seiten der obersten Ebene anzuzeigen:

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

Weitere Informationen finden Sie unter this .

Sie können auch beide Probleme beheben, indem Sie [wp_get_nav_menu_items][2] verwenden und anschließend eine benutzerdefinierte Schleife verwenden, um nur die Seiten der ersten und obersten Ebene zu analysieren.

BEARBEITEN *** Ich habe einige Zeit damit verbracht, etwas zu beginnen, um zu helfen. Leider kann ich es momentan nicht beenden und könnte es vielleicht eleganter machen, aber das könnte ein Anfang sein:

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

sie können versuchen, etwas wie:

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

Hatte nicht die Gelegenheit, dies zu testen.

0
Sormano

Als Referenz war Sormano auf dem richtigen Weg, aber der Filter übergibt eine Zeichenfolge. Die richtige Version wäre:

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

Dies funktioniert natürlich nur, wenn Sie auch depth=1 verwenden. Es ist jedoch eine einfachere Lösung, einen Kunden-Walker zu erstellen, wenn Sie lediglich eine einfache Lösung benötigen.

0
Aaron Harun