Hugoの執筆者を複数人で切り分ける方法

団体・企業のブログでよくある複数人体制をHugoで実現する

例えば「この記事はこの人が書いています」といった情報を表示したい時、テンプレートに次のように書き、configを記述してあげることで執筆者を表示させるエリアで分岐をさせることができる。

次の3ファイルを編集する。(バージョン1.8デフォルトのtomlで考える)

  • Config
  • 執筆者を表示させるレイアウト
  • 記事のMarkDown

説明はまとめて最下段で。

Config

hugoルートディレクトリのconfig.tomlに次の様に追記する

[params]
  defaultAuthor = "デフォルトユーザー"
  [params.authors]
    [params.authors.hogehoge]
      name      = "ほげほげ"
      bio       = "biography"

執筆者を表示させるレイアウト

レイアウト中に次のように記述する。

<div class="author">
  <h4>書いた人</h4>
  {{ if .Params.author }}
    {{ $author := index .Site.Params.Authors .Params.author}}
    {{ if $author }}
      <!-- Front Matterのauthorがauthors中にあるとき -->
      <p>Name: {{ $author.name }}</p>
      <p>Bio: {{ $author.bio }}</p>
    {{ else }}
      <!-- Front Matterのauthorがauthorsに無かったとき -->
      <p>Name: {{ .Params.author }}</p>
    {{ end }}
  {{ else }}
    <!-- Front Matterにauthorが無かったとき -->
    <p>Name: {{ .Site.Params.defaultAuthor}}</p>
  {{ end }}
</div>

記事のMarkDown

記事のFront Matterに次の行を追加する

+++
author = "hogehoge"

+++

toml構文で色々と迷ったが結局はこの形に落ち着くらしい。
テンプレートのレイアウトにある、

{{ $author := index .Site.Params.Authors .Params.author}}

ここだけちょっとgo言語(っぽい)。
$authorという変数を、「.Site.Params.Authorsの中でキーが.Params.authorと一致するもの」で宣言する。
このときの.Site.Params.Authorsがconfig.tomlで書いたところであり、.Params.authorがMarkDownで書いたところである。
基本的にtomlの属性は何でも許されている(っぽい)ので、Hugoでレイアウトをカスタマイズする時はこのような手法を取るのが良いと思われる。