唐突ですがWordPressの話です。
少し前まで、移転前のはてなブログと同じ形式のパーマリンクを使っていたのですが、それが急に使えなくなるという事象がありました。
その原因と対策について、書き残しておこうという記事です。
事象
はてなブログから移転する際、リダイレクト設定を容易にするためにパーマリンクの形式をはてなブログと同じにしていました。下記のようなものです。
/entry/%year%/%monthnum%/%day%/%hour%%minute%%second%/
従来はこれで問題なかったのですが、今年の5月初めごろ、急にこの形式のリンクが機能しなくなるという事象が発生しました。
具体的に言うと、個別投稿ページではなくアーカイブページが表示されるようになってしまいました。
今までこう表示されていたものが…
こうなってしまった
原因
色々調べたところ、WordPress5.4.1へのアップデート時の仕様変更によるものだということが判明しました。
WordPressのフォーラムに同様の症状になった方の投稿があり、参考になりました。/wp-includes/class-wp-query.phpの実装が変わり、個別記事ページの判定方法が変更されたようです。
以前は、はてなブログのリンク形式のように投稿日時を秒数まで指定することで個別投稿ページと判定される処理でした。つまり、URLの中に投稿時間の秒数まで含まれていればそれはさすがに記事を一意に特定していると言えるよね、という思想だったということです。しかし今回のアップデートにより、秒数まで一致している複数記事が存在するケースも理論上はあり得る、というより厳格な考え方に基づいて、投稿タイトルや投稿IDをリンクに含めることが必須となった、ということのようです。
個別投稿ページと判定される条件が厳格化された結果、上記のようにアーカイブページとなってしまったということです。
暫定対策
/wp-includes/class-wp-query.phpをアップデート前のバージョンに戻してやることで対処できました。
実際、この状態で2ヶ月くらい運用していたのですが、バージョンの古いプログラムでWordPressの方針に沿わないパーマリンクを使い続けるのもよろしくないと思い、本格対策を行うことにしました。
本格対策
まずは、パーマリンク設定を変更。シンプルに投稿IDだけのURLになるようにしました。
/%post_id%/
次に、元々のはてなブログ形式のURLから、新しいURLへリダイレクトする設定を行いました。
リダイレクト設定の方法はいろいろあると思いますが、最も手っ取り早く、Redirectionというプラグインを使うことにしました。リダイレクト元のURLとリダイレクト先のURLを対応づけるCSVを作ってインポートするだけなので、非常に簡単です。
各記事に対応する%post_id%の値は、データベースを直接参照して取得するのが早かったです。MySQLにログインして、postsテーブルからIDとpost_nameを取得すればOK。
リダイレクトの設定が完了したら、/wp-includes/class-wp-query.phpを最新版にアップデート。そして、旧URLにアクセスして新URLにリダイレクトされていることを確認して作業完了しました。
以上、簡単ですが、はてなブログ式パーマリンクが機能しなくなった理由とその対策について書いてみました。同様の事象に見舞われた方の参考になれば幸いです。
にほんブログ村
関連記事&スポンサーリンク