WordPressで404ページを作成

WordPress で404ページを作成する機会がありましたので、その手順の備忘録。行った作業は、以下の3つです。

・404.php のテンプレートファイルを作成
・.htaccess の設定
・functions.php で template_redirect フック設定

スポンサーリンク

404.php のテンプレートファイルを作成

WordPress のテンプレート・ディレクトリに、404.php という名前のテンプレートファイルを作成します。このテンプレートが、HTTP ステータスコードの404 Not Foundを返す時に表示される内容となる。

WordPress でアクセスされたページが存在しない場合、デフォルトでは index.php のテンプレートを表示するようになっています。404.php を作成しておくと、存在しないページヘのアクセス時に、この 404.php のテンプレートが表示されます。なので、404.php は必ず作成しておいたほうが良いかと。

404.php

上記404.php は GitHub の Gist にもアップロードしてますので、ご自由にお使いください。(MIT License)

404 not found page template for wordpress. (MIT License)

一応、Google Analytics などで解析できるように head 部の最後で get_template_part( ‘analytics’ ); と analytics.php(トラッキング用コード)の部分テンプレートを読み込むようにしてます。不要であれば、この行は削除してください。

.htaccess の設定

ウェブサーバーにカスタマイズした 404.php ファイルを使用させるために、.htaccess に設定を追加します。.htaccess は、WordPress のインストールディレクトリに設置する。

.htaccess

詳細は、公式ドキュメントを参照。

サーバーが 404 ページを見つけるのを助ける

デフォルト設定では、WordPress が特定のページを探すことができなかった場合、404.php ページを探します。しかし、WordPress が気づく前に、ウェブサーバーがこの問題に遭遇することがあります。この場合でも、ウェブサーバーのカスタム 404 エラー処理を設定することで、訪問者に 404.php テンプレートファイルを返すようにできます。

functions.php で template_redirect フック設定

テンプレート・ディレクトリの functions.php に template_redirect フックの設定を追加します。使用しているテンプレート以外のページヘのアクセス時に、404 を返すようにする function を定義しました。ホワイトリストで許可するテンプレートを判定して、それ以外のページへのアクセスは404を返す。

functions.php

【追記 2015/03/02】
is_feed() を if 文の判定に追加しました。これがないと、フィードのURLで 404 not found を返してしまいます。
【追記ここまで】

【追記 2016/04/08】
is_tag() を if 文の判定に追加しました。
【追記ここまで】

上記コードは、以下のページを参考にさせて頂きました。使用しているテンプレート(archive.php, cateogry.php, index.php, page.php, search.php, single.php, feed ページなど)以外のページへのアクセスに対しては 404 を返すようにしています。

WordPress での 404 ページの作成 | Web Design Leaves

参考元のページに加えて、is_*** による判定を追加と status_header(404); を追加しています。status_header(404) でHTTPステータスコードの404を送信しないと、ページ内容は 404 not found の表示なのに、送信されるHTTPステータスコードは200になって整合性が取れない場合があると考えまして。

保険的な function なので、この page_not_found_404 の template_redirect フック設定は作らなくても良いかもです。もしくは、もっと良い方法がありそうな気もします…。

あと、exit が使ってある理由を調べました。公式ドキュメントでそれらしい情報を発見。

Loading a different template

Loading a different template is not a good use of this action hook. If you include another template and then use exit() (or die()), no subsequent template_redirect hooks will be run, which could break the site’s functionality. Instead, use the template_include filter hook to return the path to the new template you want to use. This will allow an alternative template to be used without interfering with the WordPress loading process.

訳:違うテンプレートを読み込むのは、template_redirect フックの使い方としては良くないよ。別のテンプレートを include して exit() か die() を使うと、それ以降の template_redirect フックは実行されないんだ。それは、つまりサイトの機能を壊す可能性があるってこと。その代わりに、君が使いたい別のテンプレートのパスを得るためには、template_include フックを使ってね。この方法だと、WordPress の読み込みプロセスを邪魔せずに、代わりのテンプレートが使えるよ。

なるほどな〜、本来は template_redirect フックで、テンプレートを include するのは良くないらしい。ということで、template_include フックも少し調べてみた。

Plugin API/Filter Reference/template include « WordPress Codex

template_include フックを使う方法も試してみたのですけど、なんか上手くいきませんでした。404 ページ用なので、exit しても差し支えないかと考えまして、結局 template_redirect フックを使いました。代替手段が見つかったら、また変更します。以上で、WordPress の404 ページ作成は終了です。

スポンサーリンク
WordPress は人気ナンバーワンのブログ・ウェブサイトの管理ツールです。PHP を使えればカスタマイズできるので、ぜひトライされてみてください。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!