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
が採用される。
これの設定は、記事には更新日時を持たないもの(作成日時=更新日時)もある
という用途にもあっている。