- 更新日: 2016年4月8日
- WordPress
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" /> <title>お探しのページが見つかりませんでした</title> <?php get_template_part( 'analytics' ); ?> </head> <body> <div> <p>お探しのページが見つかりませんでした (404 Not Found)</p> <p> お探しのページは存在しません。<br /> もしくは一時的にアクセスできないか、<br /> 移動または削除された可能性があります。<br /> URLに間違いがないかご確認をお願いいたします。 </p> <p><a href="<?php bloginfo('url'); ?>"><?php bloginfo('name'); ?> のトップページに戻る</a></p> </div> </body> </html> |
上記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
1 2 3 4 |
# 404 error ErrorDocument 404 /index.php?error=404 |
詳細は、公式ドキュメントを参照。
サーバーが 404 ページを見つけるのを助けるデフォルト設定では、WordPress が特定のページを探すことができなかった場合、404.php ページを探します。しかし、WordPress が気づく前に、ウェブサーバーがこの問題に遭遇することがあります。この場合でも、ウェブサーバーのカスタム 404 エラー処理を設定することで、訪問者に 404.php テンプレートファイルを返すようにできます。
functions.php で template_redirect フック設定
テンプレート・ディレクトリの functions.php に template_redirect フックの設定を追加します。使用しているテンプレート以外のページヘのアクセス時に、404 を返すようにする function を定義しました。ホワイトリストで許可するテンプレートを判定して、それ以外のページへのアクセスは404を返す。
functions.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function page_not_found_404() { if( is_month() || is_category() || is_home() || is_page() || is_search() || is_single() || is_feed() || is_tag() ) { return; } status_header(404); include(TEMPLATEPATH . '/404.php'); exit(); } add_action('template_redirect', 'page_not_found_404'); |
【追記 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 templateLoading 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 ページ作成は終了です。
- – 参考リンク –
- Creating an Error 404 Page – WordPress Codex 日本語版
- WordPressの中途半な404エラーを改善する | モノについてのモノ語り
- ステータスコードチェッカー
- 【WordPress】特定のページへアクセスが来たらステータス404を返す
- WordPress の関連記事
- WordPressをTwitter Bootstrapでレスポンシブデザイン対応
- WordPressブログに更新日を表示
- WordPressにOGP設定・プラグインなしでFacebook/Twitter Cards対応
- WordPressでパンくずリスト・複数の親子カテゴリーを表示
- WordPressでプライベートな非公開ブログを運用
- BackWPupでエラー ERROR: Dropbox API: (35)
- ブログ・WordPress記事をFacebookに自動投稿するIFTTT設定
- RSS Graffitiが終了…代替にはIFTTTが使える
- WordPressで親カテゴリーに属する子カテゴリーの一覧を出力
- wp_list_categoriesでリンクなしで投稿数ゼロのカテゴリを表示 – WordPress
- 初回公開日: 2015年2月25日
Leave Your Message!