Я пытаюсь создать меню, которое показывает максимум 5 пунктов. Если есть больше предметов, он должен обернуть их в другой <ul>
элемент, чтобы создать выпадающий список.
5 предметов или меньше:
6 предметов или больше
Я знаю, что такую функциональность можно легко создать с помощью устройства, которое подсчитывает пункты меню и переносит их, если их больше, чем 5, в отдельном виде <ul>
. Но я не знаю, как создать этот ходок.
Код, который показывает мое меню на данный момент, выглядит следующим образом:
<?php wp_nav_menu( array( 'theme_location' => 'navigation', 'fallback_cb' => 'custom_menu', 'walker' =>new Custom_Walker_Nav_Menu ) ); ?>
Я заметил, что если меню не определено пользователем, и вместо него используется резервная функция, то ходунки не действуют. Мне нужно, чтобы это работало в обоих случаях.
menus
navigation
walker
Снежный шар
источник
источник
Walker_Nav_Menu
и в кодексе есть пример . Что вы имеете в виду под «Я не знаю, как создать Уокер»?Ответы:
Используя пользовательский Walker,
start_el()
метод имеет доступ к$depth
параметру: когда это0
элемент, является верхним, и мы можем использовать эту информацию для поддержания внутреннего счетчика.Когда счетчик достигнет предела, мы можем использовать
DOMDocument
для полного вывода HTML только последний добавленный элемент, обернуть его в подменю и снова добавить в HTML.редактировать
Когда количество элементов в точности соответствует количеству, которое нам требовалось + 1, например, мы требовали, чтобы 5 элементов были видимыми, а меню - 6, нет смысла разделять меню, потому что элементов будет 6 в любом случае. Код был отредактирован для решения этой проблемы.
Вот код:
Использование довольно просто:
источник
$split_at = 5
но$count
индекс начинается с 0.$split_at
аргумента, 5 по умолчанию.Есть даже способ сделать это возможным только с помощью CSS. Это имеет некоторые ограничения, но я все же подумал, что это может быть интересный подход:
Ограничения
Подходить
Хотя я на самом деле не использую «Количество запросов», креативное использование
:nth-child
и~
я читал в недавнем количественных запросах для CSS, привело меня к этому решению.Подход в основном такой:
...
точки, используяbefore
псевдоэлемент.Вот код CSS для разметки меню WordPress по умолчанию. Я прокомментировал встроенный.
Я также создал jsfiddle, чтобы показать его в действии: http://jsfiddle.net/jg6pLfd1/
Если у вас есть дополнительные вопросы, как это работает, пожалуйста, оставьте комментарий, я был бы рад уточнить код дальше.
источник
Вы можете использовать
wp_nav_menu_items
фильтр. Он принимает вывод меню и аргументы, которые содержат атрибуты меню, такие как кусок меню, контейнер и т. Д.источник
DOMDocument
можно использовать. Однако в этом вопросе нет подменю, поэтому ответ является правильным для данного конкретного случая. DOMDocument был бы «универсальным» решением, но сейчас у меня нет времени. Вы можете исследовать;) циклически просматривая элементы LI, если у вас есть дочерний элемент UL, пропустите его, это будет решение, но нужна письменная версия :)ul
. WordPress уже зацикливает пункты меню в обходчике меню. Это уже медленная операция сама по себе , добавление и дополнительный цикл, я думаю, это не правильное решение, в общем, пользовательский обходчик был бы намного более чистым и эффективным решением.Есть рабочая функция, но не уверен, что это лучшее решение.
Я использовал нестандартный ходок:
Функция, которая показывает фактическое меню, следующая:
Я объявил глобальную переменную $ menu_items и использовал ее, чтобы показать закрытие
<li>
и<ul>
-tags. Вероятно, это можно сделать и в обычном ходунке, но я не нашел, где и как.Две проблемы: 1. Если в меню всего 5 пунктов, последний элемент также включается в альт-мысль, в которой он не нужен.
источник
substr_count($output,'<li')
будет не== 4
в том месте ...