WordPress開発では、しばしば出くわす404 Not Found。
いいかげん慣れてきたので、日頃は無意識に対応できていますが、記事にするため対策をまとめました。
目次
1)httpd.confのAllowOveride 設定を確認。
基本的にパーマリンク設定を行えば、wordpressディレクトリに配置した「.htaccess」ファイルによる、URLの書き換え(rewrite)が必要だ。基本的にはWordpressが(ユーザが)更新を行ってくれるが、.htaccessのパーミッション設定などの問題でこれが行われない時がある。
選定を保存した直後、管理画面に、こんなメッセージが出ているはずだ。(あまり主張が強くないから、たまに見逃してしまう。)
「.htaccessを更新する必要があります」
具体的には、デフォルトはWordpressディレクトリ(wp-contentなどたくさん入っているディレクトリ)配下のファイルオーナーはすべてあなたのユーザ名になっている。一方でWordpressを実行しているのは、多くの場合アパッチだろう。Ubuntsuならwww-data、私のマックは_wwwというユーザ名。
共有サーバーを借りているなら、(なぜか)書き換えが成功するが、私のローカル環境(MacOS)はこんな感じだ。
$ ls -la | grep htaccess -rw-r--r-- 1 joe wheel 236 Nov 3 22:04 .htaccess
これではwheelグループに含まれていないアパッチは書き込めない。実際は、上記の管理画面の同じページの下の方までスクロールすると、そのままコピペできるように表示してくれている。とても親切だ。
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
あとはこれをwordpressディレクトリの.httaccessに追記すればOK。もし、.htaccessがなければさくっと作成しよう。
2)mod_rewriteを有効かどうか確認
3)管理画面から、もう一度「パーマリンク設定>保存」してみる
カスタムポストを作成したときによくある事例。
すべてのパーマリンクと、worpressのクエリ(?p=1234とかいうやつ)への情報は、キャッシュで保存されており、通常は、一階作成されると、キャッシュを読み続ける。flush_rewirte_ruleという関数もあるのだが、この処理は比較的重く、WPロードで毎回呼ぶのは好ましくない。
このキャッシュを簡単にクリアする方法が、管理画面で保存ボタンを押す事だ。変更はしなくていい。ただパーマリンク設定を保存しなおそう。
4)WPのリライトを確認
そろそろ佳境だ。
リライトの設定状態を確かるために、こういったプラグインもあるが、いちいちプラグインを実行するのは億劫な人も多いのでは?
https://wordpress.org/plugins/rewrite-rules-inspector/
テーマ開発者なら、プラグインよりは、下記のようなチェッカーコードのスニペットが役に立つ。共有してくれたsoulseekah、に感謝しつつ紹介:
https://gist.github.com/soulseekah/2321074
わたしはこのコードをfunctions.phpに張りつけ、
if ( isset( $_GET['_rewrite'] ) ) { // Execute the function }
などの条件で実行している。こまったらいつでもURLに?_rewriteを付記すればすべてのルールを確認できる。
好ましくはないが・・誤って本番に出してしまっても、問題にならないだろう(だれもこのURLを実行することはない)