sitemap.xml で lastmod が YAML front matter の date で指定した日時になっていて、 追記などをしたときに更新されないのが気になったので、 調べてみると jekyll-last-modified-at というプラグインがあったので使ってみることにしました。
対象バージョン
- jekyll (3.7.3)
- jekyll-sitemap (1.2.0)
- jekyll-last-modified-at (1.0.1)
仕組み
lib/jekyll-last-modified-at/determinator.rb をみると、 ソースファイルの git の commit 日時を調べて、 なければソースファイルの mtime を使う、 という仕組みになっているようです。
Gemfile 追加
Gemfile
に gem 'jekyll-last-modified-at', group: :jekyll_plugins
を追加して bundle update
しました。
_config.yml 設定
plugins:
に - jekyll-last-modified-at
を追加しました。 追加しなくても動いているようでしたが、念のため追加しました。
sitemap.xml 生成の時にエラーになったので、 以下の設定も入れて、 sitemap.xml からタグのページを隠していましたが、 別の方法で解決したので、設定は消して、 sitemap.xml にタグのページは入るように戻しました。 (path: "tag/"
の状態でコミットしていましたが、きいていませんでした。)
defaults:
- scope:
path: "tag"
values:
sitemap: false
metadata.json 対応
dateModified を page.date
から page.last_modified_at
に変更しました。
Last modified at: 追加
一部ページで設定しない
jekyll-tagging のページで Liquid Exception: No such file or directory - .../blog.n-z.jp/tag/event/index.html does not exist! in /_layouts/default.html
のようなエラーになるので、 以下のように page_path
をみて last modified を追加しないようにしました。
トップや jekyll-paginate のページも index.md の commit 日時になってしまうので、 みにいかないようにしました。
_plugins/skip_last_modified_at.rb:
# frozen_string_literal: true
require 'jekyll-last-modified-at/determinator'
module SkipLastModifiedAt
def last_modified_at_time
return if page_path == 'index.html' # jekyll-paginate
return if %r!\Atag/! =~ page_path # jekyll-tagging
super
end
end
class Jekyll::LastModifiedAt::Determinator
prepend SkipLastModifiedAt
end