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:
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.
Entsprechend dem Codex müssen Sie nur depth
parameter 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
}
}
?>
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.
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.