「トップページだけスライダーを出す」「商品ページだけCSSを読みこむ」——今どんなページを表示しているかを判定するのが条件分岐タグです。使い方はifに入れるだけです。
<?php if (is_front_page()) : ?>
<!-- トップページだけの内容 -->
<?php endif; ?>よく使う条件分岐タグ
| タグ | trueになるページ |
|---|---|
is_front_page() | サイトのトップページ(URLの一番上) |
is_home() | 投稿一覧のページ |
is_single() | 投稿の詳細ページ(is_single('slug')で個別指定も可) |
is_page() | 固定ページ(is_page('about')・is_page([1,2])) |
is_singular() | 投稿・固定ページ・カスタム投稿タイプの詳細すべて |
is_archive() | 一覧系すべて(カテゴリ・タグ・日付・投稿タイプ) |
is_category() | カテゴリ一覧(is_category('news')) |
is_tag() | タグ一覧 |
is_tax() | カスタムタクソノミー一覧(is_tax('season')) |
is_post_type_archive() | カスタム投稿タイプの一覧(is_post_type_archive('shohin')) |
is_search() | 検索結果 |
is_404() | 見つからないページ |
is_paged() | 2ページ目以降 |
in_category() | 今の投稿が指定カテゴリに属するか(in_category('news')) |
has_term() | 今の投稿が指定タームを持つか(has_term('winter', 'season')) |
is_user_logged_in() | ログイン中か |
is_admin() | 管理画面か |
つまずきの定番:is_homeとis_front_page
名前から想像する意味と、実際がずれているのが混乱の元です。
is_front_page()——サイトの入口(https://example.com/)is_home()——投稿一覧のページ
「設定」→「表示設定」の設定で関係が変わります。
| 表示設定 | トップURL | 投稿一覧URL |
|---|---|---|
| ホームページの表示=最新の投稿 | is_front_page()とis_home()が両方true | 同じページ |
| ホームページの表示=固定ページ | is_front_page()のみtrue | 指定した「投稿ページ」でis_home()がtrue |
「トップだけ」をやりたいならis_front_page()。ここをis_home()にしていると、固定ページ運用に切り替えたとたんに動かなくなります。
詳細ページ系の使い分け
<?php if (is_single()) : ?> <!-- 投稿の詳細(固定ページは含まない) -->
<?php if (is_page()) : ?> <!-- 固定ページ -->
<?php if (is_singular('shohin')) : ?> <!-- 商品の詳細ページ -->
<?php if (is_singular()) : ?> <!-- 詳細ページなら何でも -->is_single()は投稿とカスタム投稿タイプが対象で、固定ページは含みません。「詳細ページ全部」をまとめたいときはis_singular()が便利です。
実例1:ページごとにCSS・JSを読みこむ
functions.phpで条件分岐すると、必要なページだけに読みこめるので表示が軽くなります。
function my_scripts() {
wp_enqueue_style('main', get_theme_file_uri('style.css'), [], '1.0');
if (is_front_page()) {
wp_enqueue_script('slider', get_theme_file_uri('js/slider.js'), [], '1.0', true);
}
if (is_singular('shohin')) {
wp_enqueue_style('product', get_theme_file_uri('css/product.css'), [], '1.0');
}
}
add_action('wp_enqueue_scripts', 'my_scripts');テーマ開発functions.phpとCSSの正しい配線CSS・JSの読みこみ(wp_enqueue)の基本はこちら実例2:ページタイトルを1か所で出し分ける
<h1 class="page-title">
<?php if (is_front_page()) : ?>
シマエナガ堂
<?php elseif (is_home()) : ?>
お知らせ
<?php elseif (is_category() || is_tag() || is_tax()) : ?>
<?php echo esc_html(single_term_title('', false)); ?>
<?php elseif (is_post_type_archive()) : ?>
<?php echo esc_html(post_type_archive_title('', false)); ?>
<?php elseif (is_search()) : ?>
「<?php echo esc_html(get_search_query()); ?>」の検索結果
<?php elseif (is_404()) : ?>
ページが見つかりません
<?php else : ?>
<?php the_title(); ?>
<?php endif; ?>
</h1>分岐の順番が大事です。広い条件(is_archive())を先に書くと、細かい条件(is_category())に届きません。細かいものから先に並べます。
実例3:特定カテゴリの投稿だけ表示を変える
in_category()はループの中で「今の投稿」を判定します。
<?php if (in_category('event')) : ?>
<p class="notice">イベントの参加には申しこみが必要です。</p>
<?php endif; ?>カスタムタクソノミーならhas_term()です。
<?php if (has_term('winter', 'season')) : ?>
<span class="badge">冬限定</span>
<?php endif; ?>組み合わせと除外
<?php if (is_singular() && !is_front_page()) : ?> <!-- 詳細ページで、トップではない -->
<?php if (is_page(['about', 'company'])) : ?> <!-- 複数の固定ページ -->
<?php if (is_home() || is_archive()) : ?> <!-- 一覧系すべて -->!(否定)と&&・||を使えば、たいていの要件は表現できます。
まとめ
- 条件分岐タグは
ifに入れるだけ。トップはis_front_page()、投稿一覧はis_home() - 詳細ページは
is_single()(投稿系)・is_page()(固定)・is_singular()(全部)で使い分け is_category()はページの種類、in_category()は投稿の所属——取り違えが定番のつまずき- 分岐は細かい条件を先に。
functions.phpではフックの中で呼ぶ
出し分けが自在になると、テンプレートの枚数を増やさずに要件を満たせるようになります。