如何使用 Jekyll 通过自定义 YAML 前端变量对帖子进行排序?

Posted

技术标签:

【中文标题】如何使用 Jekyll 通过自定义 YAML 前端变量对帖子进行排序?【英文标题】:How to use Jekyll to sort posts by a custom YAML front matter variable? 【发布时间】:2018-12-09 14:27:27 【问题描述】:

我正在尝试在我的 Jekyll 站点中创建一个页面,该页面将显示一个自定义变量并列出包含该自定义变量的帖子。

我使用 Thiago Rossener 创建的模板创建了一个电影评论博客: 蒂亚戈的模板:https://github.com/thiagorossener/jekflix-template 我的网站:https://www.howdareyoureview.com/

在每篇文章中,我都在 YAML 前端定义了与电影细节(即演员、导演分数等)相关的自定义变量

例如:

---
layout: post
title: "Baby Driver"
image: 'https://res.cloudinary.com/how-dare-you-review/image/upload/c_fill,h_399,w_760/v1529865791/baby-driver.png'
tags:
- action
score: 72
director: Edgar Wright
written-by: Edgar Wright
staring: 
- Ansel Elgort
- Lily James
- Eiza González
- Jon Hamm
- Jamie Foxx
---

我想创建与此模板中已存在的标签页面完全相同的页面: https://www.howdareyoureview.com/tags/

除了我想按导演、主演等而不是标签来排序。 标签页面是使用 tags.html 文件中的以下代码创建的:

---
layout: minimal
title: "#Tags"
permalink: /tags/index.html
description: "Procure por sua #tag favorita."
---

<div class="tags">
% assign tags_list = site.tags %
  % if tags_list.first[0] == null %
    % for tag in tags_list %
        <a href="# tag | slugify "> tag </a>
    % endfor %
  % else %
    % for tag in tags_list %
        <a href="# tag[0] | slugify "> tag[0] </a>
    % endfor %
  % endif %
% assign tags_list = nil %
</div>

% for tag in site.tags  %
    <div class="tag-wrapper">
    <span class="tag-title" id=" tag[0] | slugify "> tag[0] </span>
    <ul class="post-list">
        % assign pages_list = tag[1] %
        % for post in pages_list reversed %
            % if post.title != null %
            % if group == null or group == post.group %
            <li><a href=" site.url  post.url "> post.title <span class="entry-date"><time datetime=" post.date | date_to_xmlschema " itemprop="datePublished"> post.date | date: "%m/%d/%Y" </time></a></li>
            % endif %
            % endif %
        % endfor %
        % assign pages_list = nil %
        % assign group = nil %
    </ul>
</span>
</div>
% endfor %

为了为我创建的自定义变量实现这一点,我尝试将“tag/tags”替换为director,并将文件作为“directors.html”保存到根目录,但页面为空白。

---
layout: minimal
title: "#Directors"
permalink: /directors/index.html
description: "Procure por sua director favorita."
---
<div class="directors">
% assign directors_list = site.director %
  % if directors_list.first[0] == null %
    % for director in directors_list %
        <a href="# tag | slugify "> director </a>
    % endfor %
  % else %
    % for director in directors_list %
        <a href="# director[0] | slugify "> director[0] </a>
    % endfor %
  % endif %
% assign directors_list = nil %
</div>

% for director in site.director  %
    <div class="director-wrapper">
    <span class="director-title" id=" tag[0] | slugify "> director[0] </span>
    <ul class="post-list">
        % assign pages_list = director[1] %
        % for post in pages_list reversed %
            % if post.title != null %
            % if group == null or group == post.group %
            <li><a href=" site.url  post.url "> post.title <span class="entry-date"><time datetime=" post.date | date_to_xmlschema " itemprop="datePublished"> post.date | date: "%m/%d/%Y" </time></a></li>
            % endif %
            % endif %
        % endfor %
        % assign pages_list = nil %
        % assign group = nil %
    </ul>
</span>
</div>
% endfor %

由于代码和概念与填充标签的方式完全相同 - 我不明白为什么这不起作用 - 我希望有人能提供帮助!

这是我的整个目录供参考: https://github.com/howdareyoureview/howdareyoureview.github.io

【问题讨论】:

【参考方案1】:

标签页使用site.tags,这是一个由site.posts组成的数组,由Jekyll在生成时创建。

您正在尝试通过定位 site.directors 进行复制,但该预期数组不存在。但是,您可以使用 group_by 过滤器来实现您的目标。

<div class="directors">
  % assign directors = site.posts | group_by: 'director' | sort: "name" %
  % for director in directors %
    % if director.name == "" %
      % assign name = "Anonymous" %
    % else %
      % assign name = director.name %
    % endif %
    <a href="# name | slugify "> name </a>
  % endfor %
</div>

% for director in directors %
<div class="director-wrapper">
  % if director.name == "" %
    % assign name = "Anonymous" %
  % else %
    % assign name = director.name %
  % endif %
  <span class="director-title" id=" name | slugify "> name | debug </span>
    <ul class="post-list">
      % assign pages_list = director.items %
      % for post in pages_list reversed %
        <li><a href=" site.url  post.url "> post.title <span class="entry-date"><time datetime=" post.date | date_to_xmlschema " itemprop="datePublished"> post.date | date: "%m/%d/%Y" </time></a></li>
      % endfor %
    </ul>
  </span>
</div>
% endfor %

提示:您可以使用检查过滤器来调试您的变量。 myvar | inspect

【讨论】:

l如果我的前端变量是空格分隔数组,我该如何使用它?例如,我在一些帖子中有变量words: hello world sun,我想通过这些词获取帖子(所有帖子都带有helloworldsun)。 @FilipŠ,问一个真正的问题。获得帮助的机会更多。

以上是关于如何使用 Jekyll 通过自定义 YAML 前端变量对帖子进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

Jekyll/Liquid - 如何将大块文本添加到 YAML 前端?

Jekyll - 无法访问自定义前端变量

Jekyll 检测以 yaml 前端为页面的 sass 文件

Jekyll定制收藏钩

在 Java 中解析 YAML 前端

在 YAML 变量中包含 jekyll / 液体模板数据?