Jekyll 中多个系列 Post 的单一索引博客 Post

Single Index Blog Post for Multiple Series Posts in Jekyll

我有几个博客 post 属于同一个博客 post。例如,我有几个关于 SQL 动物园教程的 post,但我希望能够 link 它们最多一个 "umbrella" post 这样我博客的索引页上只有一个 SQL Zoo post。我从 https://codeasashu.github.io/implement-series-post-jekyll-part-2/ 得到这个想法并尝试按照说明进行操作,但现在我的系列 post 没有出现在我的索引页面上。我的 _includes 文件夹中名为 post-series.html 的文件中有以下代码:

{% assign seriesarray = '|' | split : '|' %}
{% assign seriestitle = '' %}
{% assign serieslabel = '' %}
{% assign sortedposts = (site.posts | sort: 'date') %}
{% for post in sortedposts %}
    {% if post.series and page.series_slug != nil and post.series == page.series_slug %}

        {% capture postitem %}    <li> <a href="{{ site.url }}{{ post.url }}">{{ post.title }}</a> </li> {% endcapture %}
        {% assign seriesarray = seriesarray | push: postitem %}
        {% assign seriestitle = 'Posts in this series' %}
        {% assign serieslabel = 'Series Post' %}

    {% elsif post.series != nil and page.series != nil and page.series == post.series %}

        {% assign pageurl = page.url | split:'/' | last %}
        {% assign posturl = post.url | split:'/' | last %}
        {% if pageurl != posturl %}
        {% capture postitem %}    <li> <a href="{{ site.url }}{{ post.url }}">{{ post.title }}</a> </li> {% endcapture %}
        {% else %}
        {% capture postitem %}    <li> {{ post.title }} </li> {% endcapture %}
        {% endif %}
        {% assign seriesarray = seriesarray | push: postitem %}

    {% endif %}

    {% if post.series_slug != nil and page.series != nil and page.series == post.series_slug %}
        {% capture series_title %} <a href="{{ site.url }}{{ post.url }}">{{ post.title }}</a>  {% endcapture %}
        {% assign seriestitle = 'This posts is part of series - ' | append: series_title %}
        {% assign serieslabel = 'This posts is part of series - ' | append: series_title %}
    {% endif %}

{% endfor %}

{% capture serieslayout %}
    {% if seriesarray.size > 0 %}
    <hr />
    <div class="panel">
        <div class="panel-body">
        <h4> {{ seriestitle }} </h4>
        <ul id="post-series-list">
    {% endif %}
    {% for post in seriesarray %} {{ post }} {% endfor %}
    {% if seriesarray.size > 0 %} </ul> </div> </div> {% endif %}
{% endcapture %}

以及我目录根目录中 index.html 文件中的以下代码:

---
layout: index
---

<div id="home">
  <h1>{{ site.title }}</h1>
  <hr />

<ol class="posts">
  {% for post in paginator.posts %}
  {% assign seriesPost = nil %}
  {% if post.series == nil %}
  {% if post.series_slug != nil %} {% assign seriesPost = '(Series)' %} {% endif %}
    <li class="post-listing">
      <img class="post__image" src="/static/img/{{ post.cover_image}}" alt="{{ post.cover_alt }}" />
      <div class="post__text">
        <a class="post__title" href="{{ post.url }}">{{ post.title }}</a><br>
        <span>
          {{ post.date | date_to_string }} &bull;
          {% assign words = post.content | number_of_words %}
          {% if words < 360 %}
            1 min read
          {% else %}
            {{ words | divided_by:180 }} min read
          {% endif %}
        </span>
        {{ post.excerpt }}
      </div>
    </li>
    {% endif %}
    {% endfor %}
  </ol>

  <!-- <div class="sidebar-right sidebar"></div> -->

  <!-- <ul>
    {% for post in paginator.posts %}
      <li>
        <a href="{{ post.url }}">{{ post.title }}</a>
        {{ post.excerpt }}
      </li>
    {% endfor %}
  </ul> -->

  <!-- Pagination links -->
  {% if paginator.total_pages > 1 %}
    <ul class="pagination pagination-sm">
      {% if paginator.previous_page %}
        <li><a href="{{ paginator.previous_page_path | prepend: site.baseurl | replace: '//', '/' }}">&laquo;</a></li>
      {% else %}
        <li class="disabled"><span aria-hidden="true">&laquo;</span></li>
      {% endif %}

      <li><a href="/">First</a></li>

      {% for page in (1..paginator.total_pages) %}
        {% if page == paginator.page %}
          <li class="active"><a>{{ page }}<span class="sr-only">(current)</span></a></li>
        {% elsif page == 1 %}
          <li><a href="/">{{ page }}</a></li>
        {% else %}
          <li><a href="{{ site.paginate_path | prepend: site.baseurl | replace: '//', '/' | replace: ':num', page }}">{{ page }}</a></li>
        {% endif %}
      {% endfor %}

      <li><a href="/page/{{ paginator.total_pages }}/">Last</a></li>

      {% if paginator.next_page %}
        <li><a href="{{ paginator.next_page_path | prepend: site.baseurl | replace: '//', '/' }}">&raquo;</a></li>
      {% else %}
        <li class="disabled"><span>&raquo;</span></li>
      {% endif %}
    </ul>
  {% endif %}
</div><!-- end #home -->

我的完整回购可以在这里找到:https://github.com/thedatasleuth/thedatasleuth.github.io

在您的 index.html 中,{% if post.series == nil %} 只是裸露 posts,其中包含要打印的 series: someserie front matter 变量。

对于第二个问题(注意在SO上,你应该一次问一个问题):

  1. 雨伞post前面总是series_slug: "My serie slug" 重要的。
  2. Serie 的 post 前面总是有 series: "My serie slug" 重要的是,这必须严格等于伞页面 series_slug。 (例如:你有一个 post 与 published: falseseries: "SQL Zoology" 不会出现在 SQL Zoo 系列,如果你出版的话。)

_layouts/post.html 中删除 {% include series.html %}.

_includes/post-series.html 中用以下代码替换所有代码:

{% comment %} #### On an umbrella page {% endcomment %}
{% if page.series_slug != nil %}
  {% assign key = page.series_slug %}
  {% assign title = page.title %}
  {% assign url = page.url %}
  {% assign sentence = "All posts in this serie :" %}
{% endif %}

{% comment %} #### On a serie page {% endcomment %}
{% if page.series != nil %}
  {% assign key = page.series %}
  {% assign umbrella_page = site.posts | where: 'series_slug', key | first %}
  {% assign title = umbrella_page.title %}
  {% assign url = umbrella_page.url %}
  {% assign series_posts = site.posts | where: "series", key %}
  {% for post in series_posts %}
    {% if post.url == page.url %}
      {% assign idx = forloop.index %}
    {% endif %}
  {% endfor %}
  {% capture sentence %}
  This article is <strong>Part {{ idx }}</strong> in a <strong>{{ series_posts.size }}-Part</strong> in <a href="{{ site.baseurl }}{{ url }}">{{ title }} serie</a>
  {% endcapture %}
{% endif %}

{% if page.series_slug != nil or page.series != nil %}
  {% assign series_posts = site.posts | where: "series", key %}
  <hr />
  <div class="panel">
    <div class="panel-body">
      {% if page.series_slug != nil %}
        {% assign key = page.series_slug %}
        {% assign title = page.title %}
        {% assign url = page.url %}
      {% endif %}

      <h4>{{ sentence }}</h4>
      <ul id="post-series-list">
      {% for post in series_posts %}
        <li>
        {% if page.url == post.url %}
          This post : {{ post.title }} - part {{ forloop.index }}
        {% else %}
          <a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }} - part {{ forloop.index }}</a>
        {% endif %}
        </li>
      {% endfor %}
      </ul>
    </div>
  </div>
{% endif %}

您面临的问题

您忘记添加 seriesseries_slug YML 变量。这就是为什么它不适用于您的情况。您似乎没有完全理解代码的工作原理,可能是由于解决方案的复杂性。因此,我添加了另一个(更简单的)解决方案,它可能同样适合您的需求。


一个better/simpler解决方案

只需将一个名为 group: groupname 的 YML 变量添加到组中的每个 post。在分页期间不要跳过任何 post。接下来,使用下面的代码在每个 post(在您的 page/post 布局中)的页脚列出具有相同组的 post。最后,给系列中的post个名字加上'part 1'、'part 2'等。

{% if post.group != nil %}
  <ul>
  {% for post in site.posts %}
    {% if post.group == page.group %}
      <li><a href="{{ post.url }}">{{ post.title }}</a></li>
    {% endif %}
  {% endfor %}
  </ul>
{% endif %}

PS。如果你真的想在分页中跳过一些 posts,我会创建一个通用的解决方案。在 Front Matter (YML) 中添加一个 skip_pagination 布尔值,然后在分页循环中查看它是否为真。这使您可以跳过分页器中的任何 post。