Movable Type で記事を保存した際に、直前 / 直後の記事アーカイブを自動的に再構築するプラグイン

Movable Type で記事を保存した際に、直前 / 直後の記事アーカイブを自動的に再構築するプラグインを書いて公開しましたというお話。

Movable Type で記事アーカイブを公開設定 「スタティック」 にしている場合、一般的には新規記事や既存記事を保存 (新規公開したり更新した場合) した際に、その記事はもちろん、前後の記事についても記事アーカイブが再構築されます。「されます」 といっても公式なドキュメントでそう書かれているものをみたことはないので 「そういうものだ」 として特に気にしてなかったんですけども。

とにかく、その仕組みによって、<mt:EntryPrevious><mt:EntryNext> が含まれている記事アーカイブにおいても、ある記事を更新すれば、自動的に前後の記事も合わせて更新されて、都度正しい <mt:EntryPrevious> / <mt:EntryNext> の値が出力されると。

ところが、なんか私の特定環境だけなのか、何か条件があるのか不明ですが、個人的に管理している Movable Type (バージョンは 9.0.x) で記事を新規公開した時に、その記事の前後 (正確には最新の日付で新規追加するので 「1つ前」 だけなんですが) 記事が再構築されず、1つ前の記事が参照する <mt:EntryNext> がないものとして空で出力されるという症状にぶつかりました。

つまり、どこかのタイミングで記事アーカイブ全体を再構築したり、記事を新規追加して公開する度に 1つ前の記事も 「保存」 ボタンを押さないと、ずーっと <mt:EntryNext> が空の記事アーカイブが出力され続けるってことになります。

何が起こったのか

前述の通り私の環境だけたまたま何かの条件が重なっただけの可能性もありますが、一応どういう状況だったかだけメモしておきます。

当該ブログはちょっと特殊で、記事アーカイブ自体は直接 HTML は書き出しておらず、外部から参照する JSON を記事ごとに書き出しているだけという作り。テストする前の最新記事の JSON は以下のような内容でした。現時点で最新の記事なので、<mt:EntryNext> が空なのは想定内というか正しいです。

テスト前の最新記事から書き出された JSON のキャプチャ

{
  "entry": [
    {
      "id": 1298,
      "title": "記事タイトル",
      "body": "<p>記事本文</p>\n",
      "more": "",
      "publishDate": "2026-07-10 23:01:31",
      "publishDateISO": "2026-07-10T23:01:31+09:00",
      "publish": "2026-07-10 23:01",
      "publishY": "2026",
      "publishM": "07",
      "modifiedDate": "2026-07-11 09:04:51",
      "modifiedDateISO": "2026-07-11T09:04:51+09:00",
      "modified": "2026-07-11 09:04",
      "excerpt": "記事サマリー",
      "previousLink": "2026-07-09-213616",
      "previousTitle": "1つ前の記事タイトル",
      "pagePath": "2026-07-10-230131",
      "tweetOn": false
    }
  ]
}

この状態で、新規に記事を追加して公開した場合、期待している動作はこの記事の記事アーカイブも更新されて、<mt:EntryNext> が出力されることです。ところが、テストしてみても以下のように何も変化がありませんでした。つまり再構築されていない。

新規で記事を追加した後の同じ記事(元最新記事)から書き出された JSON のキャプチャ / 内容が変わっていない。つまり再構築されていない

どう対処したのか

原因はわからないけれど、事象として起こっていることは明確なのと、原因を探していても時間がもったいないので、ちゃちゃっと簡単なプラグインを書きました。それが今回の記事のタイトルですね。

何か記事を保存したとき、強制的にその記事の前後の記事についても記事アーカイブを再構築してしまうというプラグインです。名前はそのまんま、「RebuildNeighbors」。以下のリポジトリに公開していますので、もし同じような症状でハマった人は試してみてください。

プラグインを入れて同ブログで新たに記事を追加してみましたが、以下のように隣の記事を保存することで再構築され、正しく <mt:EntryNext> が出力されるようになりました。

RebuildNeighbors 導入後に新規記事を追加した際の 1つ前の記事から出力された JSON / 狙い通り、<mt:EntryNext> が出力された

{
  "entry": [
    {
      "id": 1298,
      "title": "記事タイトル",
      "body": "<p>記事本文</p>\n",
      "more": "",
      "publishDate": "2026-07-10 23:01:31",
      "publishDateISO": "2026-07-10T23:01:31+09:00",
      "publish": "2026-07-10 23:01",
      "publishY": "2026",
      "publishM": "07",
      "modifiedDate": "2026-07-11 09:04:51",
      "modifiedDateISO": "2026-07-11T09:04:51+09:00",
      "modified": "2026-07-11 09:04",
      "excerpt": "記事サマリー",
      "previousLink": "2026-07-09-213616",
      "previousTitle": "1つ前の記事タイトル",
      "nextLink": "2026-07-11-222630",
      "nextTitle": "次の記事タイトル(出て欲しかったやつ)",
      "pagePath": "2026-07-10-230131",
      "tweetOn": false
    }
  ]
}

ということで、今回はプラグインで解決してしまったけれど、結局原因はわかりません。実際にこの Blog でも同じように JSON 書き出していますけど、記事を保存すれば問題なく前後記事の記事アーカイブも更新されてて困ったことないので。マジで謎。

もし同じような症状にぶち当たった方がいらっしゃったら教えて欲しい。

関連エントリー

記事をここまで御覧頂きありがとうございます。
この記事が気に入ったらサポートしてみませんか?