wordpress WordPress での 404 ページの作成

2013年6月9日

以下の情報は古くなっている部分がございます。
最新の情報は以下をご覧ください。

テンプレートとテンプレート階層/404 ページ


<WordPress の仕様>

  • WordPress では該当するページがない場合、優先的に index.php が表示されるようになっている。
  • 404.php を作成すると、該当ページがない場合これが表示されるようになる。
  • 404.php は、「404 エラー」で表示するページを編集するテンプレート。
  • 404 ページが表示されているかは「is_404()」で判定して分岐できる。

404 エラーページの作成

  • 「指定されたページは存在しませんでした」や「ページが見つかりませんでした」などのエラーメッセージを表示。
  • 表示中のエラーになったページの URL を表示
  • 検索フォームを表示
  • トップページへ戻るリンクを表示。
<!-- 404.php -->
<?php get_header(); ?>
<div id="main">
  <h2>404 Not Found(ページが見つかりませんでした)</h2>
  <p>指定された以下のページは存在しないか、または移動した可能性があります。</p>
  <p class="error_url">URL :<span><?php echo get_pagenum_link(); ?></span></p>
  <p>現在表示する記事がありません。よろしければ、検索ボックスにお探しのコンテンツに該当するキーワードを入力して下さい。</p>
  <?php get_search_form(); ?><!-- 検索フォームを表示 -->
  <p><a href="<?php echo home_url(); ?>">トップページへ</a></p>
</div>
<?php
get_sidebar();
get_footer();

リクエストされたページの URL は get_pagenum_link() で取得しています。get_pagenum_link() は指定されたページ番号のリンクを取得しますが、ページ番号を指定しなければ現在のページの URL が取得できます。また取得する値はデフォルトで esc_url() によりエスケープ処理されています。

以下のように $_SERVER 変数を使って記述しても表示できます。

<?php 
$protocol = empty($_SERVER["HTTPS"]) ? "http://" : "https://"; 
echo esc_url($protocol. $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]);
?>

エラーが出ても 404.php でページが生成されない場合

エラーが出ても 404.php でページが生成されない場合があるので、.htaccess に「ErrorDocument 404 /index.php?error=404」という設定を追加する。

WordPress をサブディレクトリにインストールしている場合は、「ErrorDocument 404 /サブディレクトリ名/index.php?error=404」という形で指定する必要がある。

.htaccess
# BEGIN WordPress
・・・省略・・・
# END WordPress
ErrorDocument 404 /index.php?error=404

また、生成するページが見つからなくても、WordPress が類似した URL のページを自動的に表示するケースもあり、その場合はエラーページは表示されない。

.htaccess がない場合

ローカル環境などでは、パーマリンク設定がデフォルトのままだと.htaccess ファイルが生成されない場合があるようなので、そのような場合は、デフォルト以外に変更してみると、.htaccess ファイルが生成される。

必要のないページ種類の場合に404を表示する方法

  • WordPressはページ種類の制御をURLで行っているため、パーマリンク設定に従った変な URLを入力すると、関係のないページが表示される場合がある。
  • このような動作を防ぐためには、使用しているページ以外の場合に、404 を表示するように指定することもできる。
  • 但し、以下のこのコードはテーマ改修などで新たにページ種類を追加した場合も 404 になっていまうので、記述したことを忘れないようにしなければならない。
/*  存在しないページを指定された場合は 404 ページを表示する  */
function redirect_404() {
  //メインページ・シングルページ・アーカイブ(月別)・固定ページ 以外の指定の場合 404 ページを表示する
  if(is_home() || is_single() || is_month() || is_page()) return;
  include(TEMPLATEPATH . '/404.php');
  exit;
}
add_action('template_redirect', 'redirect_404');