XMLサイトマップの更新日時を直した

目次

  1. 1. 発端
  2. 2. プラグイン
  3. 3. 原因
  4. 4. 修正方針
  5. 5. 対応
  6. 6. 結果
thumb

画像はAIに適当にそれっぽいものを作らせてみましたw
こういうとき便利っすね。

発端

このブログは他の記事なんかでも書いているとおり、Hexo という静的サイトジェネレータを使って作っています。ついでにXMLサイトマップ(sitemap.xml) も Hexo のプラグインを使って生成してサーバーに設置しています。

で、とある日に気がついたのですが、sitemap.xml に記載されている <lastmod> の値が、全ての記事でサイトの最終ビルド日時になっていました。いつからというか、たぶん最初からずっとこうだったと思われます。サイトマップの中身にほぼ頓着していないので正直ずっとスルーしちゃっていましたが、さすがにこれはマズいということで原因を調べて対応することにしました。

プラグイン

まず最初に疑ったのはサイトマップ生成プラグインのバグでした。が、しかし 公式リポジトリの Issue を見てもそんな話はひとことも出ていませんでした。考えてみたらバグならもっと早くに Issue が上がって、すでに解決されていてもおかしくないですね。

Issues · hexojs/hexo-generator-sitemap

また、自分のローカル環境でビルドを実行してみたところ、<lastmod> の値は記事によってちゃんとバラけていました。ということはビルド環境に依存している可能性が高そうと推測しました。

原因

ウチのブログは GitHub Actions のコンテナ上でビルドしていますので、このあたりに原因がありそうと考え調べを進めました。

結論としては、GitHub Actions がどうこうではなく、ソースの生成日時がそのままlastmodになっていた ということでした。

GitHub Actions は実行のたびにクリーンなコンテナ環境を作り直しています。当然、ソースもその際に clone しなおしています。例えば、GitHub から何かしらリポジトリを clone すると、各ファイルの生成日時は clone 時点のものになりますが、今回はこれがそのまま <lastmod> の日時になっていたというわけでした。前から使っている自分のパソコンでは <lastmod> がバラけていたのもそのためです。

修正方針

原因はわかったのでどうするか検討します。

そもそもこんな話があり、<lastmod> は必ずしも必要な項目ではないようです。

Googleは、サイトマップのpriorityを無視する。lastmodは正確なら利用する。

lastmod が十分に正確なら利用すると思う。

ということで方針としては以下のようにすることにしました。

  • デフォルトは <lastmod> をつけない
  • 記事を更新した場合は更新日を <lastmod> に設定する

対応

hexo-generator-sitemap は自分でテンプレートを用意することも可能なので、プロジェクト直下に sitemap_template.xml を作りました。内容はこんなかんじです。シンタックスハイライターが古いのか、うまく色がついてくれませんがご容赦ください。

記事に last_updated が設定されていれば <lastmod> を追加するようにしています。これで不要な <lastmod> は付与されなくなります。<priority> もいらないのでついでに外しちゃいました。(sitemap.xmlが軽くなるので)

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% for post in posts %}
<url>
<loc>{{ post.permalink | uriencode }}</loc>
{% if post.last_updated %}
<lastmod>{{ post.last_updated }}</lastmod>
{% endif %}
</url>
{% endfor %}

<url>
<loc>{{ config.url | uriencode }}</loc>
<lastmod>{{ sNow | formatDate }}</lastmod>
</url>

{% for tag in tags %}
<url>
<loc>{{ tag.permalink | uriencode }}</loc>
</url>
{% endfor %}

{% for cat in categories %}
<url>
<loc>{{ cat.permalink | uriencode }}</loc>
</url>
{% endfor %}
</urlset>

_config.yml に作ったテンプレートを指定します。

sitemap:
path: sitemap.xml
tags: false
categories: true
+ template: ./sitemap_template.xml

あとは <lastmod> をつけたい記事はフロントマターに last_updated を書いておけばOKです。例えばこんなかんじです。last_updated は文字列として解釈させたいのでクオートを忘れないようにしてください。

---
title: 記事のタイトル
last_updated: '2023-09-24'
categories:
- カテゴリ
date: 2023-09-24 00:30:00
tags:
- Hexo
---

ちなみに last_updated の日付にクオートをつけ忘れるとこうなります。

<lastmod>Sun Sep 24 2023 00:00:00 GMT+0900 (Japan Standard Time)</lastmod>

結果

無事、必要なところにだけ <lastmod> が表示されるようになりました。ウチのように Hexo + CIによる自動ビルドという構成のサイトは同じ事象が発生していると思います。もし何かの際にこの記事を見るようでしたら対応の参考にどうぞ。

スポンサーリンク
share