トップは表示されるのに記事は404。WordPress移行でつまずいた4つの問題

第3回:生成AIと調査し、実際の結果で確かめる
この記事の4行要約
- 古いWordPressがPHP 8.3で起動しない問題は、コア・テーマ・プラグインのどこが原因かを切り分けて対応しました
- ACF PROへの統合では、field key・Repeaterの行数・画像参照などを更新前後で比較し、データの引き継ぎを確認しました
- 記事ページだけ404になった原因は、WordPressに届く前のnginxの設定不足でした
- フォームは画面遷移・表示内容・送信処理・メール到達の4つに分けて確認しました。記事の最後に移行時の確認チェックリストを載せています
小山 才喜こやま さいき
得意領域
元マイクロソフトの技術営業、ジョルダン社での事業立ち上げを経て独立、起業13年目の生涯現役社長
など著書多数
保有資格
Microsoft 認定資格(MCP)を30以上保持したタイトルホルダー
トップページは表示される。それなのに、記事を開くと404になる。
今回のWordPress・PHP移行では、こうした問題にも直面しました。WordPressの設定だけを見ていても原因が分からず、移行先のWebサーバーまで含めて調べる必要がありました。
生成AIは、原因候補の整理や修正案の作成に役立ちました。ただし、解決したかどうかは、実際の応答、ログ、データ比較で確認します。今回は、移行中に扱った4つの課題を紹介します。
1.古いWordPressが、新しいPHPで起動しない
検証環境では、旧WordPressが呼び出すget_magic_quotes_gpc()が存在せず、Fatal Errorになりました。mysqliの例外処理についても、古いコードの前提との差が確認されました。
まず必要だったのは、どこが原因なのかを整理することです。コアが原因なのか。テーマなのか。プラグインが読み込まれる時点で失敗しているのか。原因によって対応方法が変わります。
更新によって解消できる問題は、更新を軸に対応します。独自テーマで修正が必要な箇所は、既存の機能を確認しながら改修しました。
生成AIへエラーログと関連コードを渡すと、原因候補や修正案の整理を進められます。その際にも、提案された修正が、既存の動作を変えていないかを確認する必要があります。
ここでのポイントは、エラーの解消と機能の維持を、両方確認することです。
2.ACFを更新しても、既存データは引き継げるか
カスタムフィールドには、旧ACFと単独のRepeaterプラグインが使われていました。これをACF PROへ統合しました。
カスタムフィールドは、画面に表示される値だけでなく、フィールド定義と保存データのつながりも重要です。今回、更新前後で比較したのは次の情報でした。
- フィールドのID・key:既存の定義を引き継いでいるか
- Repeaterの行数:繰り返しデータが失われていないか
- 子フィールドの件数:内部のデータ構造が維持されているか
- 画像参照の状態:参照先に新たな欠落がないか
- トップページの出力:表示への影響がないか
統合結果では、既存のfield keyが維持され、テーマ側の呼び出し方を変えずに引き継げました。
また、画像参照には移行前から欠落していたものもありました。事前の状態を記録していたことで、今回発生した欠落と混同せずに評価できました。
ここでは、生成AIに比較処理の作成や結果の整理を支援してもらい、差異の内容を確認します。
ただし、データが一致したこと、公開画面が表示されたこと、管理画面で編集できたことは、それぞれ別の確認です。この統合段階では、管理画面での実際の編集操作は未検証として残されていました。
件数の一致だけで判断せず、参照関係と確認範囲を記録することが重要でした。
3.トップは表示されるのに、記事ページだけ404になる
この問題では、URLの形式によって結果が違っていました。
- トップページ:表示される
- クエリ形式のURL:PHPへ到達する
- パーマリンク形式のURL:nginxが404を返す
調査すると、記事へのアクセスはWordPressへ届く前に、nginxで404になっていました。原因は、存在しないファイルやディレクトリへのアクセスを、WordPressのindex.phpへ渡す設定が不足していたことでした。

今回追加したのは、次の設定です。
try_files $uri $uri/ /index.php?$args;
さらに、設定を保存して終わりにはできませんでした。移行先の環境では、コンテナの再作成で設定が戻らないよう、永続領域に設定を置き、起動時に反映する必要がありました。また、既に起動しているnginxにはstartだけでは変更が反映されず、設定の再読み込みが必要でした。
修正後は、再起動を挟んでもパーマリンクが動くことを確認しました。
この設定例は、今回の構成での対応です。別の環境に適用する場合は、既存設定やWordPressの配置との整合を確認する必要があります。
この問題で役立ったのは、「どの層が404を返しているのか」を分けて調べることでした。生成AIが提案する原因候補も、URLごとの応答や設定内容と照らし合わせながら絞り込みます。
4.フォームの完了画面へ進めても、確認は終わらない
問い合わせフォームでは、更新前後で本文と設定のハッシュを比較しました。メール送信を抑止した状態で、入力から確認、完了までの処理も試験しています。
ところが、後段の総合検証では、共有の確認・完了ページにある既存の分岐が問題になりました。表示するフォームが、送信元のフォームではなく、そのページの投稿者情報によって選ばれていたのです。
このように、移行の検証で見つかった問題でも、今回の移行が原因とは限りません。既存コードと変更内容を照合し、以前からの問題なのかを切り分ける必要があります。
また、フォームでは次の確認を分けます。
- 入力から確認・完了画面へ遷移できるか
- 入力した内容や正しいメッセージが表示されるか
- メール送信処理が実行されるか
- テスト先へ実際にメールが届くか

初期の試験で正常に見えていても、後段で評価が変わることがあります。今回も、途中の報告だけで判断せず、総合検証の結果を踏まえて整理する必要がありました。
画面遷移、表示内容、送信処理、メール到達を別々に評価することが大切です。
生成AIの提案を、確認できる結果へつなげる
4つの問題に共通していたのは、説明や修正案に加えて、変更前後を比較できる結果が必要だったことです。
エラーがなくなったか。データが維持されたか。再起動後も動くか。既存の問題と、新たに発生した問題を分けられるか。
Claude Codeで調査・改修・検証を進め、Codexで変更内容や確認不足をレビューし、結果をGitHubへ残す。この流れが、問題の整理と次の判断に役立ちました。
移行時に使える確認チェックリスト
今回の経験を基に、確認項目をまとめます。
□ コア・テーマ・プラグインの更新前後を記録した
□ Fatal Errorに加えて、警告やログを確認した
□ データ件数、キー、設定、参照関係を比較した
□ 移行前から存在する問題を区別した
□ トップ以外の記事・固定ページ・検索を確認した
□ 管理画面で必要な操作を確認した
□ 画像やPDFなどの実ファイルを確認した
□ フォームの表示・送信処理・メール到達を分けて確認した
□ 再起動後も設定と動作が維持されることを確認した
□ 未確認事項と残った課題を記録した
必要な試験は、サイトの機能や構成によって変わります。この一覧を出発点に、実際の業務で使う機能を加えていくと整理しやすくなります。
次回は、移行の約2か月後に発覚したPHPの重大な脆弱性への対応と、現在の日々の更新運用を紹介します。
連載「生成AIで進めたWordPress・PHP移行」のこれまでの記事
Artisan(アーティサン)とは
Artisan(アーティサン)とは、腕の良い職人を意味する言葉です。
アーティサン株式会社では、技術をつくること自体を目的とせず、使われ続ける価値として社会に届けることを使命としています。
モビリティ事業は公共交通事業者や自治体向けに、バスロケーションシステム「バス予報」、予約配車システム「オンデマンドバス予報」、GTFS作成支援「まかせてGTFS」、お知らせ配信「かんたんAlert」などを提供しています。
MSクラウド事業はMicrosoft 365、SharePoint、Power Apps、Power Automate、Copilot Studioなどを中心に、コンサルティング、設計、構築、開発、研修、内製化、運用支援を提供しています。
2つの事業を通じて、企業と社会が自らの力で最適解を導き出すための支援を行っています。
気になることがあれば、お気軽にご相談ください。
また、技術を追い求めながら会社と一緒に成長していける仲間も、積極的に募集しています。
バス予報・オンデマンド交通など、モビリティ事業のサービス一覧はこちら
モビリティ事業ページへSharePoint・Power Platformなど、Microsoftクラウド事業のサービス一覧はこちら
Microsoftクラウド事業ページへアーティサンの採用情報はこちら
採用情報ページへ