まずはorg-modeでTODOをDONEにしたときにタイムスタンプを追加する設定を行う。
orgファイルの先頭に以下を追加する。
大事なのはDONEのときに!でタイムスタンプを追加する設定にすること。

#+TODO: TODO(t) WAIT(w@/!) | DONE(d!) CANCELED(c@)

デフォルト設定だとそれぞれ状態を変化させたときに以下のようにリストが挿入される

- State "CANCELED"   from "DONE"       [2025-09-04 木 19:11] \\
  test
- State "DONE"       from "WAIT"       [2025-09-04 木 19:11]
- State "WAIT"       from "TODO"       [2025-09-04 木 19:11] \\
  test

次にM-x customize-variableでorg-log-into-drawerをtにする。
TODOの状態を変化させたとき、以下のようにLOGBOOKドロワーに格納されるようになる。

:LOGBOOK:
- State "CANCELED"   from "WAIT"       [2025-09-04 木 19:23] \\
  test
- State "WAIT"       from "DONE"       [2025-09-04 木 19:23] \\
  test
- State "DONE"       from "WAIT"       [2025-09-04 木 19:23]
- State "WAIT"       from "TODO"       [2025-09-04 木 19:22] \\
  test
:END:

この情報を使ってox-hugoではdate(記事作成日時)とlastmod(最終更新日時)を自動更新してくれる仕組みがある。
その仕組みを使うためにはorg-modeでドロワーのexportを有効にする必要がある。

orgファイルの先頭に以下を追加

#+options: d:t

タイトル見出しの下に:PROPERTIES:、その下に:LOGBOOK:が正しい配置となる。

 ** DONE ox-hugoでTODOトラッキングによる日付自動更新
:PROPERTIES:
:EXPORT_FILE_NAME: auto-update-date-using-ox-hugo
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :url "/auto-update-date-using-ox-hugo/"
:EXPORT_HUGO_CUSTOM_FRONT_MATTER+: :cover '((image .  "/img/auto-update-date-using-ox-hugo.png"))
:END:

:LOGBOOK:
- State "DONE"       from "DONE"       [2025-09-05 金 00:02]
- State "DONE"       from "DONE"       [2025-09-04 木 21:08]
:END:

ドロワー:LOGBOOK:は:PROPERTIES:の下に置かないとエクスポート時に以下のエラーが出るので注意。

Point is not in a valid Hugo post subtree; move to one and try again

これで以下のフロントマターをもつmdファイルがエクスポートされる。
dateが一番はじめにDONEになったタイムスタンプで、lastmodが一番最後にDONEをしたタイムスタンプとなる。
記事を更新した際にはDONE状態を再度DONEにしてあげればLOGBOOKに追加され、更新日時が更新される。

+++
title = "ox-hugoでTODOトラッキングによる日付自動更新"
date = 2025-09-04T21:08:00+09:00
lastmod = 2025-09-05T00:02:00+09:00
categories = ["Emacs"]
draft = false
url = "/auto-update-date-using-ox-hugo/"
[cover]
  image = "/img/auto-update-date-using-ox-hugo.png"
+++

Emacsで快適に記事を作成する環境を整えるのが楽しい。

参考