【WordPressテーマの作り方 第6回】条件分岐でページごとの表示を切り替えよう

「トップページだけ見出しを変えたい」
「ブログ記事の投稿タイプごとにレイアウトを切り替えたい」

そんなときに活躍するのが、WordPressの条件分岐タグ
テンプレートを複数作らなくても、一つのファイル内で表示を切り替えられるのが魅力です。

目次

🎯 今回のゴール

  • 条件分岐タグ(is_page()is_category() など)の基本を理解する
  • 投稿タイプやカテゴリ別に出し分けする方法を学ぶ
  • get_template_part() を使ったテンプレート管理術を習得
  • functions.php で条件分岐を活用する際の注意点を知る
  • よくあるエラーや誤用パターンを回避できるようにする

🧠 条件分岐タグの代表例

WordPressの条件分岐タグを使えば、表示しているページの種類によって処理を切り替えることができます。

条件分岐タグ判定する内容
is_front_page()フロントページ(サイト設定で指定されたトップ)
is_home()投稿一覧(デフォルトではフロントページ)
is_page('about')固定ページのスラッグ(例:「about」)
is_category('news')カテゴリーのスラッグ(例:「news」)
is_single()通常の投稿ページ
is_singular('event')カスタム投稿タイプ「event」の個別ページ

💡 is_single() は通常の投稿だけを対象にします。
カスタム投稿タイプも含めて判定したいときは is_singular() を使います。

💡 body_class() を使った代替方法

PHPの条件分岐を使わなくても、WordPressは <body> タグにページの種類に応じたクラスを自動で出力します。

例)出力されるクラスの一部

  • トップページ:home
  • 固定ページ(about):page-about
  • 投稿(IDが123):single postid-123

これらをCSSで活用すれば、条件分岐を使わずに見た目の切り替えが可能です。

body.page-about h1 {
  color: red;
}

① 固定ページだけ表示を変える(is_page()

使用場所: header.phppage.php

<?php
// 固定ページのスラッグによって見出しを切り替える
if (is_page('about')) {
  echo '<h2>会社概要</h2>';
} elseif (is_page('contact')) {
  echo '<h2>お問い合わせ</h2>';
} else {
  echo '<h2>ようこそ</h2>';
}
?>

💡 is_page() はスラッグ・ID・タイトル名いずれでも指定可能ですが、スラッグ指定が推奨されます。
スラッグは「パーマリンク設定」から確認できます。

② カテゴリーによってタイトルを切り替える(is_category()

使用場所: category.php, archive.php, header.php など

<?php
// カテゴリーごとに見出しを変更
if (is_category('news')) {
  echo '<h1>お知らせ</h1>';
} elseif (is_category('blog')) {
  echo '<h1>スタッフブログ</h1>';
} else {
  // その他のカテゴリは自動取得
  echo '<h1>' . get_the_archive_title() . '</h1>';
}
?>

🔍 複数のカテゴリをまとめて指定する方法:

<?php
// news または topics のどちらかのカテゴリなら
if (is_category(['news', 'topics'])) {
  echo '<h1>最新情報</h1>';
}
?>

③ 投稿タイプごとにテンプレートを分ける

使用場所: single.php, page.php

<?php
// 投稿タイプに応じてテンプレートを読み分ける
$post_type = get_post_type();

if (is_single() && $post_type === 'blog') {
  get_template_part('single', 'blog'); // single-blog.php を読み込む
} elseif ($post_type === 'news') {
  get_template_part('single', 'news'); // single-news.php
} else {
  get_template_part('single', 'default'); // fallback テンプレート
}
?>

📌 get_post_type() はループの外でも使用可能で便利です。

get_template_part()との併用で柔軟に管理

複数の出し分けが必要な場合はテンプレートパーツを使うとスッキリします。

<?php
// 条件によってレイアウトを切り替える
if (is_front_page()) {
  get_template_part('layouts/front');
} elseif (is_page('service')) {
  get_template_part('layouts/service');
} elseif (is_category('topics')) {
  get_template_part('layouts/topics');
}
?>

💡 get_template_part('layouts/front')layouts/front.php を読み込みます。

functions.php 内で条件分岐を使うときの注意

条件分岐は functions.php でも使えますが、フック内で実行しないと機能しません

<?php
// aboutページ専用のCSSを読み込む例
function add_custom_css_for_about() {
  if (is_page('about')) {
    wp_enqueue_style('about-style', get_template_directory_uri() . '/css/about.css');
  }
}
add_action('wp_enqueue_scripts', 'add_custom_css_for_about');
?>

❌ NG例(functions.phpの冒頭などで直接判定)

// NG例:条件分岐をフックの外で使うと false になることが多い
if (is_page('about')) {
  // これは functions.php の直書きでは効かない
}

🔻 注意:functions.php の冒頭など、WordPress の初期化が終わっていない段階では、is_page() などが機能しません。
必ず add_action() などのフック内で使いましょう。

よくある誤用パターンと解決策

💥 よくある誤用例:is_page() に日本語タイトルを指定してしまう

以下のように、固定ページのタイトル(特に日本語)を条件として使うと、うまく動かない場合があります。

❌ NG:日本語タイトルで条件分岐

if (is_page('会社概要')) {
  echo '会社情報';
}

✅ OK:スラッグで条件分岐

if (is_page('about')) {
  echo '会社情報';
}

※「about」は固定ページ編集画面の「パーマリンク」に表示されるスラッグです。

💡 固定ページを条件分岐に使う場合は、日本語タイトルではなくスラッグまたはIDを使うようにしましょう。

🔧 よくあるエラーと対策

問題例対策
functions.phpis_page() が効かない適切なフック (wp_enqueue_scripts など) 内で使用
条件の順番がおかしくて誤判定されるis_front_page() など、先に判定が必要なものを上に
get_post_type()falseになるループの前に実行していないか確認(the_post()の後ならOK)

📘 まとめ:条件分岐 × レイアウト切り替え

  • is_page()is_category() などでページごとに出し分け可能
  • 投稿タイプの切り替えには get_post_type()get_template_part() が便利
  • functions.php では必ずフックの中で条件分岐を使うこと
  • CSSだけで済む場合は <body> クラスの活用も検討する
  • 日本語タイトルでの判定は避け、スラッグを使用する

🔜 次回予告:「functions.phpでテーマに機能を追加しよう」

次回は、functions.php を使ってテーマに便利な機能を追加していく方法を解説します。

  • メニュー・ウィジェットの有効化
  • アイキャッチ・カスタムロゴの設定
  • CSS・JSの読み込み最適化

など、オリジナルテーマに欠かせない機能群を丁寧に紹介していきます!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Web制作会社勤務、業界歴10年以上。現場を走り回ってきた制作者。
これからWeb制作を学ぶ人に寄り添いながら、実務で役立つ知識をわかりやすくシェアします。
「ゼロぐらいから学べる!」をモットーに、あなたの“がんばろ”を応援します!

目次