Jekyll:在另一个帖子中包含一个帖子
Posted
技术标签:
【中文标题】Jekyll:在另一个帖子中包含一个帖子【英文标题】:Jekyll: including a post inside another post 【发布时间】:2015-07-24 04:31:19 【问题描述】:Jekyll 是否提供了一种将帖子包含在另一个帖子中的方法?我知道这听起来有点傻,但我正在将它用于烹饪/食谱网站。我的一些食谱由组件或其他更小的食谱组成。
我正在寻找一种将少量帖子包含在另一篇帖子中的方法,包括模板和所有内容。这可能吗?
我进行了大量的谷歌搜索,发现我只能包含到页面中,不能发布,而且它没有使用默认的液体模板,只是简单的降价。
想法?
【问题讨论】:
【参考方案1】:我在我的网站中使用了 Jekyll 的 Collections 来解决与您类似的问题。
集合在 Jekyll 中仍然是一个实验性功能,我使用的解决方案本身就很 hacky,但如果你不太喜欢它,它就足够易于管理了。
如需更详细、更友好的收藏介绍,请here's a great post about getting started with them。
我们需要记住的一件事是,我们应该远离此类情况的帖子。
正如 Ben Balter 在上面的链接中提到的,“如果人们将博客文章用于非博客文章,那么 Jekyll 已经失败了”。 食谱不是帖子,我们应该尽可能避免使用它们。
话虽如此,我的方法分为三个步骤:
创建两个集合(我们的自定义帖子类型)——假设它们是“食谱”和“成分”
找到一种将它们相互关联的方法 - 确保“生菜”将列在“沙拉”下
在“食谱”中包含相关的“成分” - 添加液体代码以在“沙拉”页面的某处实际显示来自“生菜”的信息。
第 1 步
为您的每个集合创建 _ingredients
和 _recipes
文件夹(确保以复数形式命名它们)并将它们添加到您的 _config.yml 文件中:
collections:
ingredients:
output: true
recipes:
output: true
permalink: /recipes/:path/
output: true
参数为集合中的每个项目创建一个单独的 html 页面,permalink
(可选)允许您控制 URL。
第 2 步
在你的 lettuce.md
集合项的 YAML front-matter 中添加这样的元数据:
---
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 slug 完全相同,否则将无法正常工作(即 greatrecipes.com/recipes/salad
)。如果您的食谱名称是一个句子,请将其括在引号中。
这个变量稍后会被 slugified,所以像 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 次。 疯狂。 em>
<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。 我认为我需要做的就是将当前配方 URL 捕获为 current_collection,而是自己提供一个 slug 列表,然后我将其与“ingredients”集合中的 slug 进行比较,仅呈现比赛。 我在想你可以在配方的元数据中列出所有成分,然后将它们与成分名称相匹配(在对它们进行处理之后)。这样做的一个问题是循环遍历元数据列表不会像使用数组一样返回单个项目,而是将所有项目混合在一起的字符串。如果发生这种情况,请尝试像这样列出元数据并查看它是否有效:ingredients: buns, patty, cheese
与我在原始回复中建议的方式相反,在列表中。
成功了。得到它的工作tonite。我做了一个稍微不同的方式,但集合是我缺少的关键。谢谢大佬!【参考方案2】:
我在寻找一种方法时偶然发现了这个问题,这就是我最终要做的。我想我会发布它,以防其他人正在寻找一种一次性完成此操作的方法,并且不想创建一个完整的集合。
在您想要包含其他帖子的帖子中,您可以使用 Jekyll 的 where
过滤器来获取对您其他帖子的引用,然后打印该帖子的内容:
---
layout: whatever
---
Your original post's content here.
% assign myOtherPost = site.posts | where:"url", "/other/post/url" | first %
myOtherPost.content
Some more content here.
【讨论】:
以上是关于Jekyll:在另一个帖子中包含一个帖子的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Jekyll 通过自定义 YAML 前端变量对帖子进行排序?