Я использовал Jekyll's Collections на моем сайте, чтобы решить проблему похожее на ваше.
Коллекции все еще являются экспериментальной функцией в Jekyll, и решение, которое я использовал, довольно хаки само по себе, но если вы не слишком сходите с ума, это достаточно управляемо.
Более подробное и дружеское введение в коллекции, here's a great post about getting started with them.
Одна вещь, которую мы должны иметь в виду, состоит в том, что нам следует избегать сообщений для таких случаев.
Как упоминалось Бен Бальтером по ссылке выше, «Если люди используют сообщения в блоге для сообщений, не связанных с блогами, Jekyll уже не удалось». Рецепты не являются сообщениями, и мы должны избегать использования их как таковых, если можем.
С учетом сказанного, вот мой подход в три этапа:
Создайте две коллекции (наши пользовательские типы пост) - скажем, это «Рецепты» и «Ингредиенты»
Найти способ связать их друг с другом - Чтобы убедиться, что «салат» будет указан под «салатом»
Включите соответствующие «ингредиенты» в свои «Рецепты» - добавление кода жидкости для фактического отображения информации f «салат» где-то на странице «салата».
Шаг 1
Создать _ingredients
и _recipes
папки для каждого из ваших коллекций (убедитесь, что назвать их во множественном числе) и добавить их в свой _config.yml файла:
collections:
ingredients:
output: true
recipes:
output: true
permalink: /recipes/:path/
Параметр output: true
создает i Индивидуальная HTML-страница для каждого элемента в коллекции и permalink
(необязательно) позволяет вам управлять URL-адресом.
Шаг 2
Добавить часть метаданных, как это к YAML предисловия вашего lettuce.md
элемента коллекции:
---
parent-collection: salad
---
Если lettuce.md
принадлежит более чем один рецепт, вы можете добавить несколько. Убедитесь в том, чтобы добавить содержимое ниже метаданных, если вам нужно описание:
---
parent-collection:
- salad
- hamburguer
- taco
---
Lettuce is really good for your health, but it kinda sucks as a food.
Обратите внимание, что salad
, hamburguer
и taco
должен назван так же, как рецепт URL слизня или это не будет работать (т.е. greatrecipes.com/recipes/ salad
). Если у вас есть имя рецепта, это предложение, вы завершаете его в кавычки.
Эта переменная будет уменьшена позже, поэтому имя parent-collection: The Amazing Souflè Français
будет соответствовать the-amazing-soufle-francais
. Тем не менее, странные вещи случаются: когда есть сомнения, просто пишите маленькие кадры salad
.
Это hacky часть.
Шаг 3
Создать конкретный макет для ваших рецептов (как _layout/recipe-page.html
) и добавьте код - это где мы будем включать ингредиенты в странице рецепта.
Помните, что ваши рецепты (salad.md
и друзья) должны указывать на этот макет.
{% capture current_collection %}{{ page.url | remove: "recipes" | remove: "/" | remove: " " }}{% endcapture %}
Здесь мы фиксируем имя рецепта из URL и присвоить его переменной current_collection
. Удостоверьтесь, что это в одной строке, потому что создание многострочной строки добавит кучу пробелов в захваченную строку и сломает ваш код 10/10 раз.Insane.
<div class="recipe-content">
<p>{{ content }}</p> -- This is the content of the current recipe in the collection, your "post text".
</div>
{% for ingredient in site.ingredients %}
{% capture captured_parent_collection %}{{ ingredient.parent-collection | slugify }}{% endcapture %} -- This capture is just to pass the slugify filter and sanitize parent.collection to make sure it matches the URL slug
{% if captured_parent_collection == current_collection %}
<div class="recipe-ingredient">
<h3>{{ ingredient.name }}</h3> -- "<h3>Lettuce</h3>"
<p>{{ ingredient.content }}</p> -- "<p>Lettuce is really good for your health, but it kinda sucks as a food.</p>"
</div>
{% endif %}
{% endfor %}
Совпадение ингредиенты для этого рецепта и включает в себя каждый из них в макете. Ясс!
Каждый из ваших ингредиентов должен появляться прямо под текстом рецепта.
Обратите внимание, что вы не вытаскиваете ингредиенты внутри текст рецепта, как вы описали в своем вопросе, но включаете их в макет после него. Насколько я знаю, вы не можете добавить вещи в середине вашего текста публикации/публикации - если вы не взломаете свой собственный путь через специальный плагин для Jekyll.
Есть, конечно, менее хакерские способы сделать это, но я так и сделал. Дай мне знать, если ты найдешь для себя какие-либо проблемы, пытаясь сделать это для себя - и кого-нибудь еще, не стесняйся меня исправить.
У меня эта настройка происходит на моем сайте - взгляните на the layout where I pull in my child collection items и the metadata on the child collection items.
Хорошо, прочитав это, это действительно похоже на то, что мне нужно. Я даже не подозревал, что коллекции существуют, и именно поэтому это были должности. Я никогда раньше не использовал Jekyll (из опыта WP). Единственное, на что я собираюсь работать, это вытащить «родительский» материал из материала переднего элемента. Я не хочу обновлять ингредиент .md каждый раз, когда новый родительский рецепт хочет его использовать. – clark
Я думаю, что все, что мне нужно сделать, это то, где вы фиксируете текущий URL рецепта как current_collection, вместо этого предоставляете список самих слизней, которые я затем сравниваю с слизнями в коллекции «Ингредиенты», только отрисовка матчей. – clark
Я думал, что вы можете перечислить все ингредиенты в метаданных рецепта, а затем сопоставить их с именами ингредиентов (после их устранения). Одна из проблем заключается в том, что циклическое перемещение по списку метаданных не будет возвращать отдельные элементы, как если бы вы работали с массивом, но строка со всеми из них была объединена. Если это произойдет, попробуйте указать метаданные, подобные этому, и посмотреть, работает ли это: 'components: buns, patty, cheese' – dfosco