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

时间:2018-09-10 15:15:49

标签: jekyll

我有几篇博客文章归入一个总括博客文章。例如,我有几篇有关SQL Zoo教程的帖子,但是我希望能够将它们全部链接到一篇“伞”帖子,这样我的博客索引页上只有一篇SQL Zoo帖子。我从https://codeasashu.github.io/implement-series-post-jekyll-part-2/那里得到了这个想法,并尝试按照说明进行操作,但是现在我的系列文章没有显示在索引页面上。我在_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

2 个答案:

答案 0 :(得分:1)

在您的index.html中,{% if post.series == nil %}仅露出要打印的包含series: someserie前题变量的帖子。

对于第二个问题(请注意,关于SO,您应该一次提出一个问题):

  1. 雨伞帖子的前面总是series_slug: "My serie slug" 问题。
  2. Serie的帖子前面总是series: "My serie slug" 无关紧要,并且必须严格等于保护伞页面series_slug。 (例如:您发布的帖子具有已发布:false 系列:“ SQL Zoology” ,如果您发布,则不会出现在SQL Zoo系列中。)< / li>

_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 %}

答案 1 :(得分:0)

您面临的问题

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


更好/更简单的解决方案

只需将一个名为group: groupname的YML变量添加到组中所需的每个帖子即可。分页时请勿跳过任何帖子。接下来,使用以下代码在每个帖子的页脚(在页面/帖子布局中)中列出具有相同组的帖子。最后,在系列的帖子名称中添加“第1部分”,“第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。如果您真的想跳过分页中的某些帖子,我将创建一个通用解决方案。将skip_pagination布尔值添加到Front Matter(YML),然后在分页循环中查看它是否为true。这使您可以跳过分页器中的任何帖子。