24
votes

I am using jekyll with Github pages for my website. I am trying to make some posts not visible in the home but they can be linked from another post. In the frontmatter I tryed to add a field visible like this:

---
layout: post
title: 
excerpt: 
visible:1
---

And then in the index.html file I did a if check:

<div class="posts">
  {% for post in paginator.posts %}
  {% if post.visible== 1  %}

  <div class="post">
    <h1>
      <a href="{{ post.url }}">
        {{ post.title }}
      </a>
    </h1>

    <span class="post-date">{{ post.date | date_to_string }}</span>
        <a class="subtitle" href="{{ post.url }}">
           {{ post.excerpt }}
        </a>
      </a>
  </div>
  {% endif %}
  {% endfor %}
</div>

The idea is that when I set 0 in the visible field, the post won't be visible in the home. Unfortanely this is not working, do you have any hints? Thanks

4
As shackett points out below, you can hide posts from the homepage and pagination by adding hidden: true to your YAML frontmatter. The posts will still be accessible, they just won't show up on your homepage.Alex Johnson

4 Answers

39
votes

This works for me:

---
layout: post
title: About Lumen
published: false
---

See [About]({{ site.baseurl }}/about)
11
votes

If you want to exclude a post/page from pagination you can add hidden: true to the YAML frontmatter. https://github.com/jekyll/jekyll-paginate/issues/6

5
votes

Try to change your front-matter from visible:1 to visible: 1.

I just tried to reproduce your example on my machine, and I found that Jekyll seems to picky about the blanks in the front-matter.

With visible: 1, your example works for me.

With visible:1, Jekyll outputs the following error message while building the site:

YAML Exception reading C:/foo/bar.md: (): could not find expected ':' while scanning a simple key at line 5 column 1

...but it still finishes building and the generated site works, except that the post is not visible.

0
votes

You need to modify the _layout/home.html file (In your case, it might be the index.html file).

Try to use an if-endif statement,like this:

{%- for post in site.posts -%}
  {% if post.hide == null or post.hide == false %}
    <li>
    {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
    <span class="post-meta">{{ post.date | date: date_format }}</span>
    <h3>
     <a class="post-link" href="{{ post.url | relative_url }}">
      {{ post.title | escape }}
     </a>
     </h3>          
    </li>
  
  {% endif %}
{%- endfor -%}

Then, hiding a post by hide: true. For example:

published: true
title: Some title
layout: post
hide: true