【问题标题】:Jekyll — Change layout if page is a post?Jekyll - 如果页面是帖子,则更改布局?
【发布时间】:2013-09-11 14:33:39
【问题描述】:

在 Jekyll 布局中,有什么方法可以检测页面是普通页面还是帖子?我想显示帖子标题,但不显示页面标题。像这样:

{% if page.is_post? %}
    <h2>{{ page.title }}</h2>
{% endif %}
{{ content }}

【问题讨论】:

    标签: jekyll liquid


    【解决方案1】:

    从 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

    【讨论】:

      【解决方案2】:

      在front-matter中声明一个post layout还不够? 如果您的帖子使用post 布局,您可以确定该页面是帖子并且您不需要添加额外的逻辑

      ---
      layout: post
      ---
      

      顺便说一句,确定页面类型的一种快速而肮脏(非常肮脏)的方法是检查页面路径,通常帖子在_posts目录下,因此您可以检查它

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

      【讨论】:

      • 我的布局是大约 50 行 HTML,所以我不想要两个仅相差一行的副本。不过感谢您提供的信息,您让我知道了如何做到这一点!
      • @Josh:您可以将布局应用到另一个布局。
      【解决方案3】:

      确定是页面还是帖子的最简单直接的方法是使用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 上这样做。)
      • 集合中的所有文档也都有一个 id,因此如果您的网站有帖子以外的集合,则此方法不起作用。
      • @kslstn 您可以使用page.collection 检查它是帖子还是集合。例如,如果是集合,则以下条件为真,如果是帖子,则为假:{% if page.id and page.collection %}
      • @kimbaudi 除非你的收藏中有帖子:)
      【解决方案4】:

      这是我解决问题的方法:

      1. _layouts/post 创建符号链接 → _layouts/main
      2. 将帖子的布局改为post

        ---
        layout: post
        ---
        
      3. _layouts/main 中添加一个 if 语句,如下所示:

        {% if page.layout == 'post' %}
            <h2>{{ page.title }}</h2>
        {% endif %}
        


      解决这个问题的更好方法可能是使用包含并有两个独立的布局,就像 @dafi 说的那样。

      【讨论】:

      • 我没有创建符号链接,单独的第 3 步对我来说很好:)
      【解决方案5】:

      帖子带有date 变量,而页面则没有。

      虽然不是防弹的,但这个解决方案不需要额外的配置:

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

      【讨论】:

      • 帖子还带有id 变量。我个人更喜欢使用page.id 来检查它是否是一个帖子。
      【解决方案6】:

      你可以设置类型,在_config.yml所有类型的默认值:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-19
        • 1970-01-01
        • 2022-09-24
        • 2014-07-22
        • 2020-10-19
        • 1970-01-01
        • 2016-11-17
        相关资源
        最近更新 更多