WordPress ではテーマやテンプレートファイルに PHP の if
文を使ってページの種類に応じた処理を行うことができます。この仕組みは「条件分岐タグ(Conditional Tags)」と呼ばれます。条件に合致するページでは true、そうでないページでは false を返すので、必要なところにのみコンテンツや処理を挿入できます。条件分岐タグは PHP ファイルに記述します。記事編集画面やウィジェット内では PHP が実行されないため効果がないことに注意してください。
本記事では初心者向けに代表的な条件分岐タグの使い方と応用例を紹介します。扱う内容はすべてテーマや子テーマの PHP ファイルで使用する前提で解説しています。
WordPressの条件分岐とは?
WordPress の条件分岐タグは、現在表示しているページが特定の条件に当てはまるかどうかをチェックする関数群です。この関数は真偽値(true/false)を返し、PHP の if
文と組み合わせて使います。例えば「トップページではスライダーを表示し、それ以外ではバナーを表示する」といったことが容易に実現できます。複数条件を組み合わせたり、特定の投稿 ID やスラッグを指定することも可能です。
WordPress の表示設定によって判定対象が変わるタグもあります。例えば is_home()
は投稿のアーカイブページを判別しますが、ホームページを「最新の投稿」に設定している場合にはトップページで true を返します。反対にホームページを固定ページに設定していると、投稿ページに指定した固定ページを表示した時に true となります。このように WordPress の設定も考慮しながら使う必要があります。
基本的な条件分岐タグの使い方
トップページと投稿アーカイブ
タグ | 用途 | ポイント |
---|---|---|
is_front_page() | サイトのトップページかどうかを判定します。 | フロントページ(ホームに固定した固定ページ)のみで処理したい場合に使用します。 |
is_home() | 投稿のアーカイブページかどうかを判定します。 | 表示設定でホームを「最新の投稿」にしている場合はトップページでも true を返します。 |
両方を併用すると「ブログ投稿インデックスページ」かつ「フロントページ」を判定できます。is_home()
と is_front_page()
の違いについて、ホームページを「最新の投稿」に設定していると is_home()
で true を返しますが、ホームページを「固定ページ」にしている場合は is_home()
では false となるため is_front_page()
と組み合わせるのが一般的です。
投稿ページ・固定ページ
タグ | 用途 | ポイント |
---|---|---|
is_single() | 投稿ページ(個別の投稿)かどうかを判定します。 | 引数に投稿 ID やスラッグ、配列を渡して特定の投稿だけを対象にできます。カスタム投稿の個別ページでも true を返します。 |
is_page() | 固定ページかどうかを判定します。 | 投稿 ID・スラッグ・配列を指定でき、特定の固定ページだけを対象にできます。 |
is_singular() | 投稿ページ・固定ページ・添付ファイルページのいずれかであるかを判定します。 | 投稿タイプ全般の個別ページをまとめて条件分岐したいときに便利です。 |
アーカイブ・カテゴリ・タグなど
タグ | 用途 | ポイント |
---|---|---|
is_archive() | カテゴリー、タグ、日付別、著者別、カスタムタクソノミーやカスタム投稿などのアーカイブページを判定します。 | 引数は無く、汎用的なアーカイブの判定に使います。 |
is_category() | カテゴリーのアーカイブページかどうかを判定します。 | 引数にカテゴリー ID やスラッグを渡すと特定カテゴリーを指定できます。 |
in_category() | 投稿ページで、特定のカテゴリーに属するかどうかを判定します。 | 個別記事でカテゴリーごとに表示を切り替える場合に使います。 |
is_tag() | タグのアーカイブページかどうかを判定します。 | 引数にタグ ID やスラッグを指定すると特定のタグを対象にできます。 |
has_tag() | 投稿ページで特定のタグが付いているかを判定します。 | タグ別にデザインを変えたい時に利用します。 |
is_search() | 検索結果ページかどうかを判定します。 | get_search_query() で検索語を取得することもできます。 |
is_author() | 著者アーカイブかどうかを判定します。 | 引数にユーザー ID やスラッグを渡すと特定の著者を指定できます。 |
is_date() /is_year() /is_month() /is_day() | 日付別アーカイブ(年・月・日)を判定します。 | is_date() は日・月・年別すべてのアーカイブを含みます。 |
is_404() | 404 ページかどうかを判定します。 | 404 ページ専用のレイアウトを作りたい場合に使用します。 |
wp_is_mobile() | 閲覧者がモバイル端末かどうかを判定します。 | モバイルと PC で表示を切り替えたいときに便利です。 |
is_user_logged_in() | ユーザーがログインしているかを判定します。 | ログインユーザー向けのコンテンツを表示する際に利用します。 |
固定ページでの条件分岐の方法
固定ページでは is_page()
を利用します。関数を空のまま使うと全ての固定ページを対象にできます。
<?php if ( is_page() ) : ?>
<!-- すべての固定ページに対して実行する処理 -->
<?php endif; ?>
特定のページ ID やスラッグを指定したい場合は引数に指定します。複数のページをまとめて判定したいときは配列形式で書きます。
<?php if ( is_page(97) ) : ?>
<!-- IDが97の固定ページの場合の処理 -->
<?php endif; ?>
<?php if ( is_page('about') ) : ?>
<!-- スラッグが「about」の固定ページの場合の処理 -->
<?php endif; ?>
<?php if ( is_page(array(97, 103, 234)) ) : ?>
<!-- IDが97,103,234の固定ページの場合の処理 -->
<?php endif; ?>
複数のスラッグをまとめて判定したい場合は、配列で指定できます。
<?php if ( is_page(array('about', 'contact', 'service')) ) : ?>
<!-- スラッグが「about」「contact」「service」のいずれかの場合の処理 -->
<?php endif; ?>
IDとスラッグを混在させることも可能です。
<?php if ( is_page(array(97, 'about', 'service')) ) : ?>
<!-- IDが97、またはスラッグが「about」「service」の場合の処理 -->
<?php endif; ?>
親ページのスラッグを指定して、その配下ページを対象にしたい場合は is_page()
単体では難しいため、is_page()
と is_page_template()
や is_tree()
関数を組み合わせることが多いです(カスタム関数として is_tree() を定義するケースが一般的)。
投稿ページでの条件分岐の方法
投稿(ブログ記事など)では is_single()
を利用します。以下のように使うとすべての投稿ページで処理を行えます。
<?php if ( is_single() ) : ?>
<!-- すべての投稿ページに対して実行する処理 -->
<?php endif; ?>
特定の投稿だけを対象にしたい場合は投稿 ID やスラッグを引数に指定します。複数の投稿を対象にするときは配列で渡します。
<?php if ( is_single(97) ) : ?>
<!-- IDが97の投稿の場合の処理 -->
<?php endif; ?>
<?php if ( is_single(array(97, 103, 234)) ) : ?>
<!-- IDが97,103,234の投稿の場合の処理 -->
<?php endif; ?>
is_single()
はカスタム投稿タイプの個別ページでも true を返します。特定のカスタム投稿タイプだけを判定したい場合は is_singular('custom_post_type')
を使用します。
アーカイブページでの条件分岐
アーカイブページは一覧表示ページ全般を指し、カテゴリー・タグ・日付・著者などさまざまな種類があります。汎用的に判定したいときは is_archive()
を使います。
特定のアーカイブを判定したい場合は専用のタグを使用します。カテゴリー一覧は is_category()
, タグ一覧は is_tag()
, 日付別一覧は is_date()
, 著者別一覧は is_author()
です。特定のカテゴリーやタグだけを対象にする場合は ID やスラッグを指定します。たとえば is_category('wordpress')
とすれば「wordpress」カテゴリーのアーカイブページだけが対象になります。
アーカイブページの 1 ページ目のみで条件を指定したい場合は !is_paged()
を組み合わせます。
<?php if ( is_category() && !is_paged() ) : ?>
<!-- カテゴリーアーカイブの1ページ目のみ実行する処理 -->
<?php endif; ?>
カスタム投稿タイプでの条件分岐
独自に登録した投稿タイプ(例:お知らせ、製品情報など)のアーカイブや個別ページでも条件分岐できます。
カスタム投稿タイプのアーカイブ
カスタム投稿タイプのアーカイブページでは is_post_type_archive()
を使用します。引数に投稿タイプのスラッグを指定すると、その投稿タイプのアーカイブページだけを判定できます。複数指定する場合は配列形式です。
<?php if ( is_post_type_archive('news') ) : ?>
<!-- カスタム投稿「news」のアーカイブページ -->
<?php endif; ?>
<?php if ( is_post_type_archive(array('news', 'product')) ) : ?>
<!-- news と product のアーカイブページ -->
<?php endif; ?>
引数を省略するとすべてのカスタム投稿タイプのアーカイブで true を返します。
カスタムタクソノミーやテンプレート
カスタムタクソノミー(独自の分類)でアーカイブページを判定する場合は is_tax()
を使用します。第一引数にタクソノミー名、第二引数にターム ID またはスラッグを渡します。
<?php if ( is_tax('news_category') ) : ?>
<!-- カスタムタクソノミー news_category のアーカイブ -->
<?php endif; ?>
<?php if ( is_tax('news_category', 97) ) : ?>
<!-- news_category タクソノミーの ID 97 のタームアーカイブ -->
<?php endif; ?>
固定ページ用のカスタムテンプレートを判定するには is_page_template()
を利用します。引数にテンプレートファイル名を指定することで、該当テンプレートが適用されたページのみ処理できます。
条件分岐を組み合わせる方法
複数の条件を組み合わせたい場合、PHP の論理演算子 &&
(AND)や ||
(OR)を使用します。例えば「モバイルかつ投稿ページのとき」に限定したいときは以下のように書きます。
<?php if ( wp_is_mobile() && is_single() ) : ?>
<!-- モバイル端末で記事ページの場合の処理 -->
<?php endif; ?>
複数の条件のいずれかに当てはまれば実行したい場合は ||
を使います。
<?php if ( wp_is_mobile() || is_single() ) : ?>
<!-- モバイル端末または記事ページの場合の処理 -->
<?php endif; ?>
否定条件を使う場合は関数の前に !
を付けます。例えば「記事ページ以外で実行する処理」は if ( !is_single() ) :
のように書きます。
よく使う実践例
特定ページだけ CSS を読み込む
ヘッダー内で条件分岐を使うと、ページごとに読み込むスタイルシートや JavaScript を切り替えることができます。以下はトップページや特定の固定ページだけ別の CSS を読み込む例です。
<!-- 共有のスタイルを読み込む -->
<link rel="stylesheet" href="/assets/css/common.css" />
<?php if ( is_front_page() && is_page() ) : ?>
<link rel="stylesheet" href="/assets/css/front.css" />
<?php elseif ( is_page('about') ) : ?>
<link rel="stylesheet" href="/assets/css/about.css" />
<?php elseif ( is_page('contact') ) : ?>
<link rel="stylesheet" href="/assets/css/contact.css" />
<?php endif; ?>
複数の条件を OR で組み合わせれば、ブログの投稿アーカイブやカテゴリー一覧など同じレイアウトのページ群に同じ CSS を読み込ませることもできます。
カテゴリー別にデザインを変える
カテゴリーごとに記事ページのデザインを変えたい場合、in_category()
で判定できます。例えば「news」カテゴリーに属する記事では大きなアイキャッチを表示し、それ以外では通常のレイアウトにするといったカスタマイズができます。
<?php if ( in_category('news') ) : ?>
<div class="hero-image">
<?php the_post_thumbnail('large'); ?>
</div>
<?php else : ?>
<div class="thumbnail">
<?php the_post_thumbnail('medium'); ?>
</div>
<?php endif; ?>
カスタム投稿のアーカイブでサイドバーを非表示にする
特定のカスタム投稿タイプのアーカイブページではサイドバーを表示しない、といったレイアウト変更も簡単にできます。
<?php if ( is_post_type_archive('product') ) : ?>
<!-- サイドバーを読み込まない -->
<?php else : ?>
<?php get_sidebar(); ?>
<?php endif; ?>
条件分岐を使う際の注意点とベストプラクティス
コーディング時の注意事項
- PHP ファイルに記述する – 条件分岐は PHP ファイル内で使用することが前提です。記事本文やウィジェット内に記述しても動作しないので注意してください。
- 半角記号と構文に注意 –
if ()
やelseif ()
の直後にはコロンを付け、endif
の後にはセミコロンを付けます。全角スペースや全角記号を使用するとエラーの原因となるので避けましょう。 - 括弧の数を合わせる –
(
と)
の数が一致しているか常に確認し、適切にインデントを付けて読みやすくします。 - コメントを残す – 何の処理か分かるようにコード内にコメントを残すと、後から見直したときに理解しやすくなります。
テーマ編集のベストプラクティス
WordPress のテーマを直接編集すると、テーマのアップデート時にカスタマイズ内容が上書きされてしまうリスクがあります。そのため、子テーマを使用して既存の WordPress テーマを編集することが推奨されます。カスタムテーマを直接編集する場合でもバックアップを取ってから行い、プラグインなど機能面のカスタマイズはテーマではなくプラグイン側にまとめることが推奨されています。サードパーティ製テーマの場合は親テーマを直接編集せず、子テーマを作成して変更を加えましょう。
条件分岐の記述が増えて複雑になるとコードの可読性が低下しやすいので、必要に応じて関数化したり、テンプレートパーツに分割して管理するなど工夫すると良いでしょう。条件を組み合わせすぎるとパフォーマンスが落ちる場合もあるため、不要な判定を減らし、キャッシュやテーマのベストプラクティスと併用して最適化することが大切です。
まとめ
WordPress の条件分岐タグは、トップページや投稿ページ・固定ページ・アーカイブなどサイトの種類ごとに処理を分けるための便利な関数です。is_front_page()
や is_home()
でトップページを判定し、is_single()
や is_page()
で個別ページを判定することができます。カテゴリーやタグ、カスタム投稿タイプに応じた分岐も用意されており、論理演算子を使えば複数の条件を組み合わせることも可能です。
条件分岐を上手に活用すれば、特定のページでのみ CSS や JavaScript を読み込んだり、カテゴリ別にデザインを切り替えたりと柔軟なカスタマイズが行えます。ただし、PHP ファイルに記述すること、半角記号や構文ルールを守ること、子テーマやバックアップで安全にカスタマイズすることを忘れないようにしましょう。