kanta's spike

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

参考

作成日: 2023/05/29