Prior to upgrading to paginator-v2, I used the following code in my header.html include to generate a menu of pages in the site root (such as Home, About, etc). Note that the link to HOME is hard-coded, and /index.html doesn’t have a title, the if sitePage.title loops through only those pages that include a title and keeps Home as the first menu item the whole time:
<div class="trigger site-navigation">
<a class="page-link" href="/">HOME</a>
{% for sitePage in site.pages %}
{% if sitePage.title %}
<a class="page-link" href="{{sitePage.url}}">{{sitePage.title}}</a>
{% endif %}
{% endfor %}
</div>
However, after updating to jekyll-paginator-v2, that code now displays pagintor pages (e.g., page 2, page 3) along with the list of pages in the root path.
My assumption is that paginator-generated index.html pages now get included in site.pages in v2 but weren’t in v1.
Any suggestions for working around this?
EDIT:
The solution was just to add a custom variable to the front matter for pages I want in the menu, and rewrite the conditional. I had been trying this but wrote the conditional incorrectly (had to double-check the liquid spec). So I found success with the following:
<div class="trigger site-navigation">
<a class="page-link" href="/">HOME</a>
{% for sitePage in site.pages %}
{% if sitePage.nav == true %}
<a class="page-link" href="{{sitePage.url}}">{{sitePage.title}}</a>
{% endif %}
{% endfor %}
</div>
Here’s another solution.
Create a data file called theme.yml
in _data
directory and add the following format. (You could also just add this to config.yml
if you are not using gem-based themes.)
navigation:
- title: Home
url: /
- title: About
url: /about/
- title: Writings
url: /writings/
- title: Themes
url: /open-source/
- title: Forestry CMS
url: https://forestry.io
- title: Contact
url: mailto:hello@example.com
Then you can call the navigation data in theme.yml
from your navigation using the following.
{% if site.data.theme.navigation %}
<nav>
{% for link in site.data.theme.navigation %}
{% if link.url contains 'http' %}
{% assign domain = '' %}
{% elsif link.url contains 'mailto' %}
{% assign domain = '' %}
{% else %}
{% assign domain = site.url | append: site.baseurl %}
{% endif %}
<a href="{{ domain }}{{ link.url }}" {% if link.url contains 'http' %}target="_blank"{% endif %}>{{ link.title | capitalize }}</a>
{% endfor %}
</nav>
{% endif %}
There are some advantages to this such as
- Support for multiple site navigations. e.g footer links.
- Control what pages are shown in each navigation.
- Open all external links in a new tab.
- Support for mailto links if not using something like Netlify form handling.
Just my 2 cents. Hope this is helpful to the community.
-Colin
2 Likes
This is a great suggestion. I’ll definitely play around with this. It seems a lot cleaner and predictable than my current approach (though my current approach has the advantage of basically automatically updating any time I add a .md file to my root, though that has pitfalls such as the one I ran into that prompted this post!)
1 Like
Another solution would be to modify the conditional in your first example to check the page’s URL. If your paginated pages follow a predictable URL scheme (e.g. /page2/index.html
, /page3/index.html
) you might to check against that and ignore them.
<div class="trigger site-navigation">
<a class="page-link" href="/">HOME</a>
{% for sitePage in site.pages %}
{% if sitePage.title %}
{% unless sitePage.url contains "/page" %}
<a class="page-link" href="{{sitePage.url}}">{{sitePage.title}}</a>
{% endunless %}
{% endif %}
{% endfor %}
</div>
1 Like