plusN コーディングとか育児とかの個人ブログ

WordPress移行後に特定記事だけ404になる原因 Custom Permalinks × 著者パーマリンクの競合

PR

少し前に依頼で、プラグイン「All-in-One WP Migration」を使用してWordPressサイトを移行したのですが、一部記事の404エラーを経験したのでログを残しておこうと思います。

データ移行で発生した現象

別サーバーに、プラグイン「All-in-One WP Migration」を使用してWordPressサイトを移行しました。
特段変わったことはしていなかったのですが、移行後の環境でなぜか特定の記事が404になっていることがわかりました。

404になった記事の特徴

404になっている記事には以下のような特徴がありました。なお、同じカテゴリーでもCustom Permalinksを使用していない記事は正常に表示されていました。

  • 特定カテゴリーに紐づいた記事
  • Custom Permalinksでスラッグを変更

当初、パーマリンク構造に問題があると考え、「設定 → パーマリンク設定」から更新を行い再度確認しました。それでも状況は変わらず、他の点も探ってみることにしました。

確認した項目

404になりそうな項目として以下の点が考えられました。

  • rewriteルールの再生成
  • .htaccessの設定
  • WordPressの設定
  • REST API
  • DB

ですが、この項目を再確認しても原因になるような点は見つけることができませんでした。
ここまでで、数時間経過していたため心が折れそうになりました。

404の原因は意外なところにあった

時間を置いて見直した結果、原因は意外なところにあったんです。
それは、パーマリンク構造とCustom Permalinksの組み合わせでした。
具体的には、パーマリンク構造を

/%author%/archives/%post_id%/

と設定し、Custom Permalinksでスラッグ変更

/original_slug/

していたことが原因だったのです。
WordPressのrewriteルールとCustom PermalinksのURL処理の影響で、移行後の環境でURL解決が正しく行われなくなっていました。

rewriteルールとは

WordPressはrewriteルールをwp_optionsrewrite_rulesにキャッシュします。
環境を移行した場合、旧環境で生成されたルールが残ることがあり、その結果、特定のURLだけ404になることがあります。

今回の対応策

対処法として、パーマリンク構造を以下に変更しました。

/%author%/archives/%post_id%/
↓
/archives/%post_id%/

また、今回は著者ごとに記事URLを分ける特殊な要件があったため、カテゴリ「blogger」が付与された記事のみ著者スラッグを付与しています。

/*
* パーマリンク設定変更
* /%author%/archives/%post_id%/
* Custom Permalinks 対策
*/
add_filter('post_link', function($permalink, $post){

    if ($post->post_type !== 'post') {
        return $permalink;
    }

    // 著者カテゴリ「blogger」判定
    if (has_category('blogger', $post)) {
        $author = get_the_author_meta('user_nicename', $post->post_author);
        return home_url('/' . $author . '/archives/' . $post->ID . '/');
    }

    return $permalink;

}, 10, 2);

これで、404を解消することができました。

作業環境

対応サーバーは以下の環境でした。

  • WordPress バージョン:6.9.1
  • PHP:8.3
  • 移行プラグイン:All-in-One WP Migration
  • 使用プラグイン:Custom Permalinks

Custom Permalinks × 著者パーマリンクの競合まとめ

今回404が発生した条件は以下でした

  • Custom Permalinks を使用
  • パーマリンク構造に %author% を使用
  • 記事IDでURL生成
  • サーバー移行を実施

そのため、以下の手順で解決しました。

  1. 「設定 → パーマリンク設定」を保存しrewriteルールを再生成
  2. .htaccessの設定、WordPressの設定、REST API、DBを確認
  3. パーマリンク構造を再確認・修正
  4. functions.phpに著者カテゴリのみスラッグを変更するコードを記載
  5. 「設定 → パーマリンク設定」を保存しrewriteルールを再生成

今回の件は、少し特殊なケースかもしれません。
なお、移行後に404が発生した場合は、「設定 → パーマリンク設定」を保存しrewriteルールを再生成(フラッシュ)してから確認すると原因切り分けがしやすくなります。
サイトやブログ構築時は、パーマリンク構造をなるべくプラグインに依存しない形で構築すると、長い目で見たときにメンテナンスが楽なのかなと思いました。

PR