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 追加

Gemfilegem '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: 追加

_layouts/post.html に追加しました。

一部ページで設定しない

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
Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published