Это должно дать хлебные крошки на любой глубине (с оговоркой, см. Конец). К сожалению, жидкостные фильтры довольно ограничены, поэтому это нестабильное решение: в любое время, когда появляется /index.html
, он удаляется, что приводит к разрыву URL-адресов с папкой, начинающейся с index.html
(например, /a/index.html/b/c.html
), надеюсь не произойдет.
{% capture url_parts %} {{ page.url | remove: "/index.html" | replace:'/'," " }}{% endcapture %}
{% capture num_parts %}{{ url_parts | number_of_words | minus: 1 }}{% endcapture %}
{% assign previous="" %}
<ol>
{% if num_parts == "0" or num_parts == "-1" %}
<li><a href="/">home</a> </li>
{% else %}
<li><a href="/">home</a> » </li>
{% for unused in page.content limit:num_parts %}
{% capture first_word %}{{ url_parts | truncatewords:1 | remove:"..."}}{% endcapture %}
{% capture previous %}{{ previous }}/{{ first_word }}{% endcapture %}
<li><a href="{{previous}}">{{ first_word }}</a> » </li>
{% capture url_parts %}{{ url_parts | remove_first:first_word }}{% endcapture %}
{% endfor %}
{% endif %}
</ol>
Как это работает:
- разделяет URL, игнорируя
index.html
(например, /a/b/index.html
становится a b
, /a/b/c.html
становится a b c.html
),
- последовательно берет и удаляет первое слово
url_parts
, чтобы перебрать все слова, кроме последнего (например, оно идет a b c.html
-> (a
, b c.html
) -> (b
, c.html
); тогда мы остановимся).
- на каждом шаге устанавливает связь с использованием текущих
first_word
и previous
, то есть всех предыдущих просмотренных каталогов (для приведенного выше примера это будет ""
-> "/a"
-> "/a/b"
)
NB. page.content
в цикле for просто дает что-то для перебора, волшебство делает limit:num_parts
. Однако это означает, что если page.content
имеет меньше абзацев, чем num_parts
, не все хлебные крошки появятся, если это вероятно, можно определить переменную сайта в _config.yml
, как breadcrumb_list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
и использовать site.breadcrumb_list
в качестве заполнителя вместо page.content
.
Вот пример (он не использует точно такой же код, как указано выше, но это всего лишь несколько небольших модификаций).