【问题标题】:Make custom page-based loop in Jekyll在 Jekyll 中制作基于页面的自定义循环
【发布时间】:2012-02-02 10:33:26
【问题描述】:

我想创建另一个基于页面的循环,就像 _posts 文件夹适用于博客部分一样,但适用于小型杂志目录。 (希望这是有道理的)

也许我误解了一些简单的事情,但我就是无法解决。 我有这个循环,感觉它应该可以工作,但没有返回任何内容。

{% for page in site.pressitems %}
<li>
    <a href="{{ post.url }}">{{ page.title }}</a>
</li>
{% endfor %}

代码,链接,解释,任何东西都非常感谢。 :)

【问题讨论】:

    标签: jekyll liquid


    【解决方案1】:

    您不能像这样将自己的收藏添加到site

    site 只知道三个集合:pagespostscategories。您可以通过 site.&lt;category&gt;.posts 获取某个类别的所有帖子。 AFAIK,类别仅适用于帖子,不适用于页面。

    这是有道理的,因为 Jekyll 应该主要是一个博客引擎,而不是一个通用的静态网站生成器。

    因此,您现在最好的解决方案是对 jekyll “撒谎”。让它相信你有帖子,而实际上你正在制作页面。

    _posts/
      pressitems/
      blog/
    

    您将能够像这样遍历 _posts/pressitems 中的元素:

    for item in site.categories.pressitems.posts do
      ... {{ item.title }} ... {{ item.url }}
    endfor
    

    同样,您的“真实博客条目”也会这样:

    for p in site.categories.blog.posts do
      ... {{ p.title }} ... {{ p.url }}
    endfor
    

    问题是你必须遵守 Jekyll 关于文件名的命名约定;你的新闻必须看起来像真实的帖子。这意味着它们必须以 yyyy-mm-dd- 字符串开头,如帖子。给他们一个随机的日期。

    _posts/
      pressitems/
        1901-01-01-the-first-press-item.textile
        1902-01-01-the-second-one.textile
    

    编辑:这篇文章最初是在 2012 年写的,但现在不是了。现代 Jekyll 确实允许您创建自己的收藏集https://jekyllrb.com/docs/collections/

    【讨论】:

    • 我觉得应该是endfor,但我可能弄错了。
    • 除了简单地输出页面、帖子和集合之外,site 对象还包含一些您可能使用的特殊集合,例如 html_pageshtml_filesstatic_files。始终参考最新的文档:jekyllrb.com/docs/variables
    【解决方案2】:

    你可以遍历site.pages

    {% for page in site.pages %}
      <h3><a href="{{ page.url }}">{{ page.title }}</a></h3>
      <p>{{ page.content }}</p>
    {% endfor %}
    

    并将列表限制为使用特定布局的唯一页面。

    {% for page in site.pages %}
      {% if page.layout == 'team' %}  
        <h3><a href="{{ page.url }}">{{ page.title }}</a></h3>
        <p>{{ page.content }}</p>
      {% endif %}
    {% endfor %}
    

    查看这篇关于生成站点地图的帖子: http://vvv.tobiassjosten.net/jekyll/jekyll-sitemap-without-plugins/

    【讨论】:

    • 非常有用,谢谢。我已经针对我自己的用例进行了调整:列出网站上的 other 页面。为此,我添加了条件 page.permalink != p.permalink(使用 p 作为迭代器值而不是 page 以避免命名空间冲突)。
    • 这很有帮助,谢谢!一点点if 逻辑在这里有很长的路要走
    【解决方案3】:

    截至October 2016:

    在 Jekyll 2.5.3 中,您实际上可以可以将自己的 collection 添加到站点。

    _my_collection 文件夹添加到根目录并填写文档。 添加到_config.yml:

    collections:
    - my_collection
    

    现在使用帖子、页面或类别调用文档。 例如 { for post in site.my_collection < do something > }

    请务必注意,此功能可以使用,它已被 Jekyll 团队标记为“实验性功能,API 可能会更改,直到该功能稳定”。

    【讨论】:

      【解决方案4】:

      在 jekyll 上,您还可以将 yaml front-matter 添加到页面。添加自定义 front-matter(如 page-category)没有任何问题。

      ---
      layout: plain
      title: "My beautiful page"
      description: ""
      snippet: ""
      page-category: "category 1"
      ---
      

      通过以下方式访问它们:

      {% for page in site.pages %}
         {% if page.page-category == "category 1" %}
              {{ page.content }}
         {% endif %}
      {% endfor %}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        • 2012-10-27
        • 2019-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        相关资源
        最近更新 更多