「Front Matterのカスタム変数をパーマリンクに使いたい!」ので、使えるようにしてみたという記事です。https://mekurun.com/ を作るのに使っています。
背景
Jekyll で生成する記事のURLは、_config.yml
の設定や Front Matter での直接の指定でカスタマイズできます。以下で軽く説明しますが、詳しくは、公式ガイドの Permalinks | Jekyll を参照ください。日本語版
_config.yml
で記事のURLを設定する方法
permalink: /:categories/:title
_config.yml
で、上記のような指定をすることで、全ポストのURLを一定のルールで決めることができます。しかし、事前に用意された Placeholder(置換用変数) しか使えません。
(組み込みフォーマットなどの説明はここでは割愛します)
Front Matter で記事のURLを設定する方法
Front Matter とは、ファイルの最初に3つのダッシュで挟まれたYAMLで、このブロックがあると Jekyllさんはファイルをいい感じに処理してくれます。記事のタイトルやカテゴリーなどを設定するのに使ったことがある方も多いでしょう。
---
permalink: /about/
---
この方法は柔軟に好きなパーマリンクを設定できますが、一定のルールで複数のページのパーマリンクを設定するのには向いていません。
本題 (_plugins
を使ってパーマリンクをカスタムする方法)
しかし、「Front Matterのカスタム変数をパーマリンクに使いたい!」という場合にはどちらも向いていません。そこで、_plugins
を使ってパーマリンクをカスタムする方法の登場です。
今回はこんな記事たち↓があるとします。デフォルトの変数の他に、author
という変数を使っていますね。この著者猫さんの名前をパーマリンクに含めるのが目標です。
---
layout: post
title: "テスト記事だにゃー"
date: 2020-06-01 11:14:26 +0900
categories: cat
author: toraneko
---
- まず、サイトのrootディレクトリ直下に
_plugins
というディレクトリを作ります。 - 適当な名前の.rbファイルを作ります。ここでは
jekyll_change_permalinks.rb
にしてみました。 - 中身を書きます。
module Jekyll
class PermalinkRewriter < Generator # Generatorクラスを継承してあげます
safe true
priority :low # プラグインがロードされる順位を決めてあげます
def generate(site) # ジェネレータはこのメソッドを使います
site.posts.each do |item|
@author = item.data['author'] # Front Matter の変数はこれで取得できます
unless @author.nil? # nilじゃないかな?チェック
item.data['permalink'] = "/:categories/#{@author}/:title/"
end
end
end
end
end
/cat/toraneko/test/
で、先程の記事が見られるようになりました!
まとめ
「Front Matterのカスタム変数をパーマリンクに使いたい!」というときはこんな方法があるよ!という紹介でした(´∀`*)
それぞれに長所と短所があるので、目的にぴったりな方法を見つけると良さそうです💭
比較
| 方法 |ルールがある |カスタム変数を使える |
|---|---|---|---|
|_config.ymlを使う方法 |○ |✗ |
|Front Matterで直指定 |✗ |✗ |
| _pluginsを使う方法 |○ |○ |
参考
Your first plugin | Jekyll • Simple, blog-aware, static sites
Generators | Jekyll • Simple, blog-aware, static sites
Permalinks | Jekyll • Simple, blog-aware, static sites
What are the steps to getting this 'custom' permalink scheme in Jekyll?
Search · class PermalinkRewriter < Generator