「トップページだけ見出しを変えたい」
「ブログ記事の投稿タイプごとにレイアウトを切り替えたい」
そんなときに活躍するのが、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.php
や page.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.php で is_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の読み込み最適化
など、オリジナルテーマに欠かせない機能群を丁寧に紹介していきます!