【问题标题】:Jekyll blog show posts under a categoryJekyll 博客在一个类别下显示帖子
【发布时间】:2025-12-21 09:00:06
【问题描述】:

我想显示某个类别的帖子。例如,转到 url http://example.com/posts/programming 将列出所有以“编程”为类别的帖子。

我的一般博客索引如下所示

  {% for post in site.posts %}
    <div class="post-box">
      <div class="post-title">
        <a href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
      </div>
      <span class="post-date">{{ post.date | date: "%b %-d, %Y" }}</span>
      <p class="post-excerpt">{{ post.excerpt }}</p>
      <div>
        {% for category in post.categories %}
          <a href="#">#{{ category }}</a>
        {% endfor %}
      </div>
    </div>
  {% endfor %}

如果 Jekyll 没有自动为每个类别提供特定的 url,我将不得不根据给定的 url 动态更改可用的帖子。我当然可以为每个类别创建一个目录,然后在其中创建index.html,但必须有更好的方法。

如果有一种方法可以使用 javascript 将{% for post in site.posts %} 部分动态更改为{% for post in posts in some_category %},那将是完美的。任何帮助都会很棒。

【问题讨论】:

    标签: javascript jekyll


    【解决方案1】:

    我当然可以为每个类别创建一个专门的目录,然后在其中制作 index.html,但必须有更好的方法。

    这是一个很好的方法,根本不需要太多工作,并且可以在 gh-pages 上完美运行。这正是我在自己的网站上所做的,因为我更喜欢将我的 .md 帖子按类别归档在目录结构中,所以我只需:

    /blog/
        /_posts/20015-01-01-my-awesome-post.md
        index.html
    
    /labs/
        /_posts/20015-01-01-my-technical-post.md
        index.html
    

    我发现维护最好不要在 _posts/ 中包含 1001 个帖子,并且我得到了我想要的漂亮的永久链接结构,而无需在每个帖子的前端输入类别。

    【讨论】:

      【解决方案2】:

      可以使用插件(为此,请参阅David Jacquel's answer...但如果您想在@上托管您的网站,则不能使用它987654322@,因为GitHub Pages supports only a few plugins, and jekyll-archives isn't one of them

      因此,如果您不能使用插件,AFAIK 除了手动为每个类别创建页面之外别无他法。
      我不是 JavaScript 专家,但我很确定用 JavaScript 动态更改类别是不可能的,因为 Jekyll 页面只编译一次,不能在运行时动态更改。

      但是为每个类别创建一个新的类别页面并不像看起来那么工作。

      我在这里有一篇博文,我解释了如何做到这一点:
      Separate pages per tag/category with Jekyll (without plugins)

      短版:
      (我在这里使用tags 而不是categories,但两者的工作原理完全相同)

      1. 创建一个特殊的layout file/_layouts/tagpage.html

        ---
        layout: default
        ---
        
        <h1>{{ page.tag }}</h1>
        
        <ul>
        {% for post in site.tags[page.tag] %}
          <li>
            {{ post.date | date: "%B %d, %Y" }}: <a href="{{ post.url }}">{{ post.title }}</a>
          </li>
        {% endfor %}
        </ul>
        
      2. 有了这个布局文件,你只需要两行YAML front-matter就可以创建一个新的标签页,例如/tags/jekyll/index.html

        ---
        layout: tagpage
        tag: jekyll
        ---
        

      【讨论】:

        【解决方案3】:

        这正是https://github.com/jekyll/jekyll-archives 正在做的事情。

        【讨论】: