Próbuję utworzyć menu, które pokazuje maksymalnie 5 elementów. Jeśli jest więcej przedmiotów, należy je zawinąć w inny <ul>
Element, aby utworzyć menu rozwijane.
5 przedmiotów lub mniej:
6 przedmiotów lub więcej
Wiem, że tego rodzaju funkcjonalność można łatwo utworzyć za pomocą walkera, który zlicza elementy menu i zawija, jeśli jest więcej niż 5 remaing w osobne <ul>
. Ale nie wiem jak stworzyć ten walker.
Kod, który obecnie pokazuje moje menu, jest następujący:
<?php wp_nav_menu( array( 'theme_location' => 'navigation', 'fallback_cb' => 'custom_menu', 'walker' =>new Custom_Walker_Nav_Menu ) ); ?>
Zauważyłem, że jeśli menu nie jest zdefiniowane przez użytkownika i zamiast tego używa funkcji rezerwowej, walker nie ma żadnego efektu. Potrzebuję go do pracy w obu przypadkach.
menus
navigation
walker
Śnieżna kula
źródło
źródło
Walker_Nav_Menu
a kodeks zawiera przykład . Co masz na myśli mówiąc „Nie wiem, jak stworzyć Walkera”?Odpowiedzi:
Używając niestandardowego Walkera,
start_el()
metoda ma dostęp do$depth
param: kiedy jest0
elemnt, jest najwyższy i możemy użyć tych informacji do utrzymania wewnętrznego licznika.Kiedy licznik osiągnie limit, możemy użyć
DOMDocument
aby uzyskać z pełnego wyjścia HTML tylko ostatni dodany element, zawinąć go w podmenu i dodać ponownie do HTML.Edytować
Gdy liczba elementów jest dokładnie taka, jakiej wymagaliśmy + 1, np. Wymagaliśmy, aby 5 elementów było widocznych, a menu ma 6, podział menu nie ma sensu, ponieważ elementy będą w każdym razie 6. Kod został edytowany, aby rozwiązać ten problem.
Oto kod:
Użycie jest dość proste:
źródło
$split_at = 5
ale$count
indeks zaczyna się od 0.$split_at
argument, domyślnie 5.Jest nawet sposób, aby to umożliwić za pomocą samego CSS. Ma to pewne ograniczenia, ale nadal uważałem, że może to być interesujące podejście:
Ograniczenia
Podejście
Chociaż tak naprawdę nie używam „zapytań ilościowych”, twórcze użycie
:nth-child
i~
przeczytałem w ostatnich zapytaniach ilościowych dla CSS , doprowadziło mnie do tego rozwiązania.Podejście jest w zasadzie takie:
...
kropki za pomocąbefore
pseudoelementu.Oto kod CSS domyślnego znacznika menu WordPress. Skomentowałem bezpośrednio.
Stworzyłem również jsfiddle, aby pokazać go w akcji: http://jsfiddle.net/jg6pLfd1/
Jeśli masz dodatkowe pytania, jak to działa, zostaw komentarz, chętnie wyjaśnię kod.
źródło
Możesz użyć
wp_nav_menu_items
filtra. Akceptuje dane wyjściowe menu i argumenty zawierające atrybuty menu, takie jak ślimak menu, kontener itp.źródło
DOMDocument
można użyć. Jednak w tym pytaniu nie ma podmenu, dlatego odpowiedź jest poprawna dla tego konkretnego przypadku. DOMDocument byłby rozwiązaniem „uniwersalnym”, ale nie mam teraz czasu. Możesz to zbadać;) zapętlanie elementów LI, jeśli ktoś ma UL, pomiń to, byłoby to rozwiązanie, ale wymaga wersji pisemnej :)ul
. WordPress już zapętla elementy menu w menu. Jest to już sama wolna operacja , dodawanie i dodatkowa pętla uważam, że nie jest właściwym rozwiązaniem, z drugiej strony niestandardowy walker byłby znacznie czystszym i wydajniejszym rozwiązaniem.Mam działającą funkcję, ale nie jestem pewien, czy jest to najlepsze rozwiązanie.
Użyłem niestandardowego chodzika:
Funkcja pokazująca rzeczywiste menu jest następująca:
Zadeklarowałem zmienną globalną $ menu_items i użyłem jej, by pokazać zamknięcie
<li>
i<ul>
-tagi. Prawdopodobnie jest to możliwe również w niestandardowym chodziku, ale nie znalazłem, gdzie i jak.Dwa problemy: 1. Jeśli w menu jest tylko 5 elementów, ostatni element jest również zawijany w zasłonę, ale nie ma takiej potrzeby.
źródło
substr_count($output,'<li')
będzie== 4
w złym miejscu ...