WordPressのオリジナルテーマ 404ページと検索結果ページの作成

目的

  • 存在しないURLにアクセスされたときの「404ページ」を表示
  • サイト内検索時の「検索結果ページ」を整える
  • ユーザーが迷わないよう、ナビゲーションや案内を適切にする

404ページとは?

404ページとは、「存在しないURL(ページ)」にアクセスされたときに表示されるエラーページです。

例えば、ユーザーが以下のような状況になった場合に表示されます:

  • ページのURLが間違っている
  • サイト内のリンク切れ(削除された記事など)
  • 外部からの古いリンクにアクセスされた

なぜ404ページが必要?

404ページが適切に表示されることで、ユーザーに以下のような案内が可能になります:

メリット内容
誤解を防ぐサイト自体が壊れている印象を与えずに済む
離脱を防ぐトップページへのリンクなどで回遊を促せる
SEO対策Googleも404ページの存在を前提にクローリングするため、整備が推奨されている

404ページの作成:404.php

テーマフォルダ unnhanbur 内に 404.php を新規作成します。

<?php get_header(); ?>
<!-- ヘッダーを読み込み -->

<main class="error-page"> <!-- エラーページ専用のスタイル用クラス -->

  <!-- タイトルとメッセージ -->
  <div class="sub-title">
    <h1>404 Not Found</h1> <!-- エラータイトル -->
    <p>お探しのページが見つかりませんでした。</p>
  </div>

  <!-- エラーの詳細とリンク -->
  <div class="container center"> <!-- コンテンツを中央寄せ -->
    <p>ページが削除されたか、URLが間違っている可能性があります。</p>
    <p>
      <a href="<?php echo home_url(); ?>" class="btn">
        トップページに戻る
      </a>
    </p>
  </div>

</main>

<?php get_footer(); ?>
<!-- フッターを読み込み -->

検索結果ページの作成:search.php

テーマフォルダ unnhanbur 内に search.php を新規作成します。

<?php get_header(); ?>
<!-- 共通のヘッダーを読み込み -->

<main class="search-page has-sidebar"> <!-- 検索結果ページ用 + サイドバーありレイアウト -->

  <!-- 検索キーワードの表示 -->
  <div class="sub-title">
    <h1>「<?php the_search_query(); ?>」の検索結果</h1> <!-- ユーザーが入力した検索語を表示 -->
  </div>

  <!-- メイン + サイドバーの2カラムレイアウト -->
  <div class="container flex-area">

    <!-- メインコンテンツ -->
    <div class="main-area">
      <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        <!-- 検索結果1件分の表示(アーカイブスタイル) -->
        <article class="archive-item">
          <a href="<?php the_permalink(); ?>"> <!-- 記事の詳細ページへのリンク -->

            <!-- アイキャッチ画像の表示(ある場合) -->
            <?php if (has_post_thumbnail()) : ?>
              <div class="archive-thumb">
                <?php the_post_thumbnail('medium'); ?>
              </div>
            <?php endif; ?>

            <!-- メタ情報(投稿日・タイトル・抜粋) -->
            <div class="archive-meta">
              <time datetime="<?php echo get_the_date('Y-m-d'); ?>">
                <?php echo get_the_date('Y年n月j日'); ?>
              </time>
              <h2><?php the_title(); ?></h2>
              <p class="excerpt"><?php echo get_the_excerpt(); ?></p>
            </div>

          </a>
        </article>
      <?php endwhile; else : ?>
        <!-- 検索結果が0件の場合のメッセージ -->
        <p>検索結果が見つかりませんでした。</p>
      <?php endif; ?>

      <!-- ページネーション(複数ページがある場合) -->
      <div class="pagination">
        <?php the_posts_pagination(); ?>
      </div>
    </div>

    <!-- サイドバー -->
    <aside class="sidebar">
      <?php get_sidebar(); ?> <!-- sidebar.php を読み込み -->
    </aside>

  </div>
</main>

<?php get_footer(); ?>
<!-- 共通のフッターを読み込み -->

CSS(必要に応じて custom.css に追加してみよう)

下記を追加するとCSSデザインを変更することができます。自分なりにカスタマイズしてみましょう。

/* 404ページ・検索ページ共通 */
.error-page .container,
.search-page .container {
  text-align: center;
  padding: 2rem;
}

.search-page .sub-title,
.error-page .sub-title {
  text-align: center;
  margin-bottom: 2rem;
}

.btn {
  display: inline-block;
  padding: 1rem 2rem;
  background: var(--primary);
  color: #fff;
  text-decoration: none;
  border-radius: 5px;
}
.btn:hover {
  background: var(--primary-hover);
  transition: background 0.3s;
}

.archive-item {
  background: #fff;
  border: 1px solid #ddd;
  border-radius: 8px;
  overflow: hidden;
  margin-bottom: 2rem;
  transition: box-shadow 0.3s;
}

.archive-item:hover {
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.archive-thumb img {
  width: 100%;
  height: auto;
  display: block;
}
.archive-meta .excerpt {
  font-size: 0.95rem;
  color: var(--text-secondary);
  margin-top: 0.5rem;
}

.archive-meta .excerpt {
  font-size: 0.95rem;
  color: var(--text-secondary);
  margin-top: 0.5rem;
}

.pagination {
  margin-top: 3rem;
  text-align: center;
}

.pagination .page-numbers {
  display: inline-block;
  margin: 0 0.3em;
  padding: 0.5em 1em;
  background: #f5f5f5;
  color: #333;
  text-decoration: none;
  border-radius: 3px;
}

.pagination .current {
  background: var(--primary);
  color: #fff;
}