杰基尔:在另一篇文章中包括一篇文章

cla*_*ark 1 markdown include jekyll yaml-front-matter

Jekyll是否提供了在另一篇文章中添加帖子的方法?我知道这听起来有点傻,但我正在将它用于烹饪/食谱网站.我的一些食谱由组件或其他较小的食谱组成.

我正在寻找一种方法,另一篇文章中包含一些帖子,包括模板和所有帖子.这可能吗?

我做了大量的谷歌搜索,发现我只能包含在页面中,而不是发布,并且它没有使用默认的液体模板,只是简单的降价.

想法?

小智 7

我在我的网站上使用了Jekyll的集合来解决类似于你的问题.

收藏品仍然是Jekyll的一个实验性功能,我使用的解决方案本身就非常简洁,但是如果你不太疯狂,那就足够了.

有关收藏的更详细和友好的介绍,这里有一篇关于开始使用它们的精彩文章.

我们需要记住的一件事是,我们应该放弃这类案件的帖子.

正如Ben Balter在上面的链接中所提到的,"如果人们使用博客文章来发表非博客帖子,那么Jekyll已经失败了".食谱不是帖子,如果可以,我们应该避免使用它们.

话虽如此,这是我的方法分三步:

  1. 创建两个集合(我们的自定义帖子类型) - 让我们说这些是"食谱"和"成分"

  2. 找到一种方法将它们相互联系起来 - 确保"生菜"列在"沙拉"下

  3. 在"食谱"中加入相关的"成分" - 添加液体代码,实际显示"沙拉"页面某处"生菜"的信息.


步骤1

为每个集合创建_ingredients和创建_recipes文件夹(确保将它们命名为多个)并将它们添加到_config.yml文件中:

    collections:
      ingredients:
        output: true 
      recipes: 
        output: true  
        permalink: /recipes/:path/  
Run Code Online (Sandbox Code Playgroud)

output: true参数为集合中的每个项目创建单独的HTML页面,permalink(可选)允许您控制URL.


第2步

将这样的元数据添加到您的lettuce.md集合项的YAML前端:

    ---        
    parent-collection: salad
    ---
Run Code Online (Sandbox Code Playgroud)

如果lettuce.md属于多个配方,则可以添加多个配方.如果需要说明,请务必在元数据下添加内容:

    ---
    parent-collection: 
     - salad
     - hamburguer
     - taco
    ---

    Lettuce is really good for your health, but it kinda sucks as a food.
Run Code Online (Sandbox Code Playgroud)

请注意salad,hamburguer并且taco应该与配方URL slug完全相同或者这不起作用(即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 %}
Run Code Online (Sandbox Code Playgroud)

在这里,我们从URL捕获配方的名称,并将其分配给current_collection变量.确保将其放在一行中,因为将其设置为多行将为捕获的字符串添加一堆空格并将代码分解为10/10次. 疯.

    <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 %}
Run Code Online (Sandbox Code Playgroud)

匹配此配方的成分,并将其中的每一个都包含在布局中.云南省社会科学院!

您的每种食材都应该出现在食谱文本的正下方.

请注意,你不拉的成分里面的配方文字就像你在你的问题描述,但包括他们在之后的布局.据我所知,你不能帖子/收藏文本的中间添加东西- 除非你通过Jekyll的自定义插件破解你的方式.


肯定会有更少的hacky方法,但这就是我的工作方式.如果您在为自己尝试此操作时遇到任何问题,请告诉我 - 其他任何人都可以随意纠正我.

我在我的网站上进行了这个设置 - 看一下我的子集合项目的布局子集合项目本身的元数据.