Hugoで記事を更新日時でソートしたい。
ただし、記事には更新日時(lastmod)を持たないもの(作成日時=更新日時)もある。
Hugoでは、以下のように記事一覧を表示した場合、デフォルトで、Weight > Date > LinkTitle > FilePathの順にソートするようだ。
<ul>
{{ range .Pages }}
<li>
<h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
<time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
</li>
{{ end }}
</ul>
これを記事の更新日時でソートしたい。
解決策
.ByLastmodと.Reverseを組合せることで実現する。
.Pages.ByLastmod.Reverseにより、ページ一覧を更新日時の逆順でソートする。
-
例
<ul> {{ range .Pages.ByLastmod.Reverse }} <li> <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1> <time>{{ .Lastmod.Format "Mon, Jan 2, 2006" }}</time> </li> {{ end }} </ul>
また、Hugoのfronmatterの日付関連のデフォルト設定では、更新日時を意味するlastmodeは以下のように定義されている。
[frontmatter]
# ...略...
lastmod = [':git', 'lastmod', 'date', 'publishDate']
# ...略...
これは、ページ変数.Lastmodを参照した時に採用される値の優先度であり、各設定の意味は以下になるようだ。
:git: Gitで管理されている該当ページの最新リビジョンの日付。ただし、--enableGitInfoオプションを付けるか、設定でenableGitInfo = trueを設定する必要があるlastmod: frontmatterのlastmod項目の日付date: frontmatterのdate項目の日付publishDate: frontmatterのpublishDate項目の日付
私のブログでは、GitInfoを有効にしていないため、.Lastmodの値は、frontmatterにlastmodがあればその日付が採用され、なければdateが採用される。
これの設定は、記事には更新日時を持たないもの(作成日時=更新日時)もあるという用途にもあっている。