結論
パーマリンクを変えた直後、トップページは表示されるのに投稿や固定ページが404になる場合、原因は次の3つに絞れます。
- リライトルールが更新されていない(設定 → パーマリンク で「変更を保存」を押すと直ることが多い)
.htaccessが無い、または内容が壊れている- サーバー側の設定(Apache の
mod_rewriteが無効、AllowOverrideがNone)
まず「設定 → パーマリンク」を開いて保存し、それでも直らなければ .htaccess とサーバー設定を順に確認します。
原因・仕組み
公式ドキュメントによると、Apache 上の WordPress は mod_rewrite を使い、.htaccess の書き換えルールで、存在しないファイル・ディレクトリへのアクセスを index.php に回します。WordPress は、その index.php の中で、保存済みのリライトルールを参照して、URL を投稿などに対応づけます。
つまり、404 には2層あります。サーバーが index.php に回してくれない(.htaccess や Apache の問題)か、回してはいるが WordPress のルールに該当が無い(ルール未更新)かです。切り分けは、/index.php/sample-post/ のように index.php を挟んだ URL なら開けるかで確認できます。開けるなら、サーバーの書き換え機能が原因です。
手順(サンプルコード)
- 管理画面 → 設定 → パーマリンク → 変更を保存。
- 直らなければ、サイトのルートの
.htaccessを確認します。標準の記述は次の通りです。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
- Apache の設定で、該当ディレクトリの
AllowOverrideをAll(少なくともFileInfo)にし、mod_rewriteを有効にします。 - プラグインやテーマからルールを更新する必要がある場合は、有効化時に1回だけフラッシュします。
register_activation_hook( __FILE__, function () {
my_register_post_types(); // 先にカスタム投稿タイプ等を登録
flush_rewrite_rules();
} );
動作確認(検証環境と結果)
WordPress 7.1.2(ja)/PHP 8.2.12 で、$wp_rewrite にパーマリンク構造 /%postname%/ を設定し、標準の書き換えルールを出力しました(tests フォルダの p9.php)。
using_permalinks=true ; using_mod_rewrite_permalinks=true
- 出力された
.htaccess用の記述は、上の標準例(RewriteCondによる存在チェックと/index.phpへの書き換え)と同じ内容でした。 - 前節のカスタムタクソノミーの検証(p3.php)では、登録直後は保存済みルールに該当 URL が無く、
flush_rewrite_rules( false )のあとに追加されました。 - Apache でのブラウザアクセスによる404の再現と解消は、この CLI 環境では確認していません。
パーマリンク変更後に404になる原因と対処の注意点
flush_rewrite_rules()は処理が重く、公式リファレンスも「必要なときだけ」としています。initフックで毎回呼ぶ、フロントエンドから呼ぶ、といった使い方は避けます。- 引数
$hardが true(既定)のとき、.htaccessも書き換えるので、書き込み権限が必要です。 - nginx では
.htaccessは使われません。try_files $uri $uri/ /index.php?$args;のようなサーバー設定が必要です。 - 変更前の
.htaccessを必ず控えます。独自のリダイレクト記述がある場合は、# BEGIN WordPressブロックの外に書きます。 - CDN やキャッシュプラグインが古い404を返し続けることがあります。キャッシュを削除して再確認します。
パーマリンク変更後に404になる原因と対処でよくあるミス
- ローカル環境で
AllowOverride Noneのまま、パーマリンクを「投稿名」に変更する。 .htaccessのRewriteBaseを、サブディレクトリ設置なのに/のままにする。- ルール更新のため、
functions.phpにflush_rewrite_rules()を書いて、全リクエストで実行させる。 - カスタム投稿タイプを登録した直後に、パーマリンクを保存し忘れる。
パーマリンク変更後に404になる原因と対処のチェックリスト
- [ ] 「設定 → パーマリンク」で保存した
- [ ]
.htaccessが存在し、標準の記述がある - [ ]
mod_rewriteとAllowOverrideが有効 - [ ]
/index.php/…形式のURLで開けるか確認した - [ ] キャッシュを削除して再確認した
- [ ] 変更前の設定を控えた
パーマリンク変更後に404になる原因と対処のFAQ(よくある質問)
Q. 保存すると .htaccess が書き換わりますか。
A. 書き込み権限があれば、WordPress が自動で更新します。権限が無いと、画面に追記すべき内容が表示されます。
Q. 一部のページだけ404になります。
A. 同じスラッグの投稿タイプやタクソノミー、固定ページが競合している可能性があります。
Q. 英数字の投稿名にしても404です。
A. ルール未更新ではなく、サーバー設定の問題が濃厚です。上の切り分けを行ってください。
筆者の見解(パーマリンク変更後に404になる原因と対処)
パーマリンクの404は、WordPress 側とサーバー側のどちらの問題かを最初に切り分けると、迷いにくいと考えています。私見では、/index.php/ 付きの URL で開けるかを確認するだけで、調査範囲を大きく絞れます。恒久的な対処は設定やバックアップの手順として残しておくと、移転時にも役立ちます。
パーマリンク変更後に404になる原因と対処の関連項目
- flush_rewrite_rules() の使い方|説明・引数・注意点
- add_rewrite_rule() の使い方|説明・引数・注意点
- register_post_type() の使い方|説明・引数・注意点
- register_taxonomy() の使い方|説明・引数・注意点
- get_permalink() の使い方|説明・引数・注意点
