Jekyll — 如果页面是文章,如何更改布局?

34
在 Jekyll 布局中,是否有办法检测页面是普通页面还是文章?我想要显示文章标题,但不想显示页面标题。像这样:

在 Jekyll 布局中,是否有办法检测页面是普通页面还是文章?我想要显示文章标题,但不想显示页面标题。像这样:

{% if page.is_post? %}
    <h2>{{ page.title }}</h2>
{% endif %}
{{ content }}
6个回答

33

从Jekyll 2.0开始,你可以使用Front Matter Defaults

defaults:
  -
    scope:
      path: ""      # empty string for all files
      type: posts   # limit to posts
    values:
      is_post: true # automatically set is_post=true for all posts

那么您可以使用 {{ page.is_post }} 检查页面是否为文章。

不清楚为什么Jekyll默认没有设置page.type


13

判断一个页面或者文章最简单最直接的方式是使用page.id

{% if page.id %}
    This is a post
{% endif %}

我在我的布局页面中使用此方法来确定它是页面还是文章,以便仅在文章时显示到前/后一篇文章的链接。

_layouts/default.html

<!DOCTYPE html>
<html lang="en">

{% include head.html %}

<body>

{% include header.html %}

{{ content }}

<!-- If this is a post, show previous/next post links -->
{% if page.id %}

{% if page.previous.url %}
<a href="{{page.previous.url}}">{{page.previous.title}}</a>
{% endif %}

{% if page.next.url %}
<a class="button is-link ellipsis" title="{{page.previous.title}}" href="{{page.next.url}}">{{page.next.title}}</a>
{% endif %}

{% endif %}

{% include footer.html %}

</body>
</html>

在回答问题时,根据条件显示内容非常完美 - 谢谢!(不确定为什么需要被投票否决,除了一些人似乎喜欢在SO上这样做。) - SexxLuthor
集合中的所有文档也都有一个ID,因此如果您的网站除了文章之外还有其他集合,则此方法无法使用。 - kslstn
@kslstn,您可以使用page.collection来检查它是帖子还是集合。例如,如果它是一个集合,则以下条件将为真,如果它是一个帖子,则为假:{% if page.id and page.collection %} - kimbaudi
1
@kimbaudi,除非您在集合内有帖子 :) - kslstn

13

在 front-matter 中声明一个文章布局是不足够的吗? 如果您的文章使用 post 布局,您可以确信该页面是一篇文章,而无需添加额外的逻辑。

---
layout: post
---

顺便提一下,确定页面类型的一种快速且简单(非常简陋)的方法是检查页面路径,通常文章都在_posts目录中,因此您可以检查一下。

{% if page.path contains '_posts' %}
This page is a post
{% else %}
This page is a normal page
{% endif %}

我的布局大约有50行HTML,所以我不想有两份只因为一行不同的副本。不过还是谢谢你提供的信息,你给了我一个实现这个的想法! - Zaz
@Josh:你可以将一个布局应用到另一个上。 - jdh8

9
以下是我的解决方法:

我是这样解决问题的:

  1. Create a symlink from _layouts/post_layouts/main
  2. Change the layout of posts to post:

    ---
    layout: post
    ---
    
  3. Add an if statement in _layouts/main like so:

    {% if page.layout == 'post' %}
        <h2>{{ page.title }}</h2>
    {% endif %}
    
更好的解决方法可能是使用include并拥有两个不同的布局,就像@dafi所说的那样。

我没有创建符号链接,只是第三步对我来说很好用 :) - Damjan Pavlica

1

文章带有一个date变量,而页面没有。

虽然不是百分之百可靠的解决方案,但它不需要额外的配置:

{% if page.date %}
    <h2>{{ page.title }}</h2>
{% endif %}

1
帖子也带有一个 id 变量。我个人更喜欢使用 page.id 来检查它是否是一篇帖子。 - kimbaudi

-1

您可以在_config.yml中为所有类型设置默认类型:

defaults:
  - scope:
      path: ""
      type: "pages"
    values:
      type: "pages"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接