べんりワザ・WordPressのテンプレートと投稿の取得

WordPressの条件分岐タグ早見表

「トップだけ表示」「この投稿タイプだけ読みこむ」を実現する条件分岐タグの早見表。is_homeとis_front_pageの違い、投稿タイプ・タクソノミー系の判定、ページごとの出し分け例をまとめました。

「トップページだけスライダーを出す」「商品ページだけ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()にしていると、固定ページ運用に切り替えたとたんに動かなくなります。

テーマ開発お知らせの一覧と詳細を作るhome.phpとfront-page.phpの関係はテーマ開発コースのこの回で

詳細ページ系の使い分け

<?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()) : ?>           <!-- 一覧系すべて -->

!(否定)と&&||を使えば、たいていの要件は表現できます。

べんりワザループの外で投稿を取得する方法(WP_Query)pre_get_postsでメインの一覧を調整する方法はこちら

まとめ

  1. 条件分岐タグはifに入れるだけ。トップはis_front_page()、投稿一覧はis_home()
  2. 詳細ページはis_single()(投稿系)・is_page()(固定)・is_singular()(全部)で使い分け
  3. is_category()はページの種類、in_category()は投稿の所属——取り違えが定番のつまずき
  4. 分岐は細かい条件を先にfunctions.phpではフックの中で呼ぶ

出し分けが自在になると、テンプレートの枚数を増やさずに要件を満たせるようになります。

よくある質問

is_home()とis_front_page()の違いは何ですか?
is_front_page()はサイトのトップページ(URLの一番上)、is_home()は投稿一覧のページです。表示設定で「ホームページの表示」を最新の投稿にしている場合は両方が同時にtrueになり、固定ページにしている場合は別のページを指します。
特定の固定ページだけで判定したいです
is_page('about')のようにスラッグを渡します。IDでも配列でも指定でき、is_page(['about','company'])で複数まとめて判定できます。
カスタム投稿タイプの詳細ページを判定するには?
is_singular('shohin')を使います。一覧(アーカイブ)側はis_post_type_archive('shohin')です。
条件分岐タグが効かないことがあります
functions.phpの読みこみ直後などクエリが決まる前に呼ぶと正しく判定できません。テンプレート内、またはwp・templete_redirect以降のフックの中で使ってください。