WordPressには「条件分岐」のためのタグがたくさん用意されています。

1. WordPressでの条件分岐の書き方

はじめに基本的な条件分岐タグの書き方や、注意点をまとめておきます。

1-1. PHPのif文で書く

条件分岐タグは「PHP」というプログラミング言語により書きます。以下は、トップページかどうかを判定する基本例です。「ココに書く」の部分は表示したいHTMLなどに差し替えてください。

<?php if (is_front_page()) : ?>
  条件に当てはまるときに表示するものをココに書く
<?php else: ?>
  条件に当てはまらないときに表示するものをココに書く
<?php endif; ?>

PHPはHTMLと混ぜて書くことができます。例えば、モバイルとPCで別の文章を表示したいときには、以下のように書きます。

<?php if ( wp_is_mobile() ) : ?>
  <p>モバイルからの閲覧時に表示する文</p>
<?php else: ?>
  <p>PCからの閲覧時に表示する文</p>
<?php endif; ?>

この中のwp_is_mobile()というのは、WordPressであらかじめ用意されている関数の1つです。Client HintやUser-Agentの情報からモバイルかどうかを判定し、画面幅を調べる関数ではありません。この他にも「特定のカテゴリーのときに…」や「トップページのときに…」など色々な種類の条件分岐タグがあるので、のちほどまとめて紹介します。

1-2. elseは省略できる

<?php if ( wp_is_mobile() ) : ?>
  モバイルで表示するものをココに書く
<?php endif; ?>

例えば「モバイルだけで表示したい&PCでは何も表示したくない」というときには上記のように<?php else: ?>から始まる偽の分岐と、その分岐内の表示内容をまとめて省略します。elseの文字だけを消すのではありません。

1-3. elseifで細かな条件分岐ができる

<?php if ( is_single() ) : ?>
  ①記事ページで表示するものをココに書く
<?php elseif ( is_page() ) : ?>
  ②固定ページで表示するものをココに
<?php else: ?>
  ①と②のどちらにも当てはまらないときに表示するものをココに
<?php endif; ?>

上のように書くと、1つめのifに当てはまらなかったときに、2つめのelseifの条件を判定してくれるようになります。<?php elseif (is_page()) : ?>はいくつ繋げてもOKです。 後ほどきちんと触れますがis_single()とis_page()はそれぞれ「投稿の個別ページが表示されるときに」、「固定ページが表示されるときに」という条件分岐です。前者は通常投稿だけでなくカスタム投稿タイプの個別ページにも当てはまります。添付ファイルの判定には専用の関数を使います。

1-4.「!」で「◯◯でないとき」という意味に

<?php if ( !is_single() ) : ?>
  記事ページ以外で表示するものをココに書く
<?php endif; ?>

半角の「!」を条件の関数の前につけることで、否定のifにすることができます。

1-5. 複数の条件を組み合わせることも

ifの括弧()内では、&&(ANDの意味)と||(ORの意味)を使って、2つ以上の条件を組み合わせることができます。

<?php if ( wp_is_mobile() && is_single() ) : ?>
  「モバイル」かつ「記事ページ」のときに表示するものをココに書く
<?php endif; ?>

条件を2つとも満たすときに表示する

<?php if ( wp_is_mobile() || is_single() ) : ?>
  「モバイル」もしくは「記事ページ」のときに表示するものをココに書く
<?php endif; ?>

条件のどちらか一方(もしくは両方)を満たしたときに表示する

1-6. コロンや括弧を書き忘れるとエラーに

PHPでは少しの文法間違いでエラーとなり、ページが表示されなくなってしまいます。

ifとelseifの後にはコロン(:)

if ( is_front_page() ) :とelseif ( is_page() ) :というように、この記事のコロン構文では条件の後にコロンを書きます。;に置き換えて同じ分岐を書くことはできません。PHPには波括弧を使う別の構文もありますが、この例はコロンとendifを組み合わせています。

endifの後にはセミコロン(;)

endif ;というように書きましょう。

括弧の数に注意

また「括弧を書き忘れていないか」にも注意しましょう。 (と)の数は一致するはずです。

全角で書かない

; : <?phpなどは必ず半角英数字で書くようにしましょう。

1-7. コメントアウトを書いておくと後から分かりやすい

<?php if(is_front_page()): //トップページのとき ?>
  <p>トップページの内容</p>
<?php else: //トップページでないとき?>
  <p>それ以外の内容</p>
<?php endif; //トップページの条件分岐終了 ?>

後から見たときに混乱しないように、:や;の後にコメントアウトを書いておくのがおすすめです。PHP文の中では、//に続けてコメントアウトを書きます(日本語可)。ここに書いたものは、Webサイトを訪れる人が見ることはないので、自分が分かりやすいように書きましょう。

1-8. 条件分岐文は記事内やウィジェット内には書けない

公開当時のクラシックエディターへPHPを書いた誤例です。画像内のコードはコピー用ではありません。
条件分岐は投稿画面には書いてはダメ

WordPressの標準の投稿エディターでは、本文に書いたPHPは実行されません。この記事の条件分岐文を、投稿本文へそのまま貼って使うことはできません。

標準のカスタムHTMLウィジェットなどもPHPを実行しません。PHPを実行する独自の仕組みとは区別してください。

1-9. 主にheader.phpやfooter.phpなどのファイルで使う

主な使用場所は、クラシックテーマのPHPテンプレートです。たとえばheader.phpやsidebar.php、footer.php、functions.phpなどで使います。ただし、ページを判定する条件分岐タグはメインクエリの成立後に評価する必要があります。functions.phpの読み込み直後にそのまま書くと早すぎます。そこでは、適切な後続のフックで呼ばれる関数の中に書きます。ブロックテーマのHTMLテンプレートへPHPを直接貼る方法とも異なります。

2. WordPressのカスタマイズで便利な条件分岐タグ

ここからはカスタマイズの際に活躍する条件分岐タグを紹介していきます。例の数値IDやスラッグは、自分のサイトのものへ差し替えてください。記事ページのis_single()は通常投稿とカスタム投稿タイプに当てはまり、固定ページはis_page()で判定します。

ホーム(トップページ)だけ

<?php if ( is_front_page() ) : ?>
  ホームでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

is_front_page()は、最新の投稿を表示する設定でも、固定ページをホームにする設定でもサイトのトップページを判定します。is_home()は投稿一覧の判定で、別に指定した「投稿ページ」にも当てはまるため、この例には含めません。トップページでのみ表示させたいものであれば<?php else: ?>から始まる偽の分岐と、その分岐内の内容をまとめて省略してOKです。

ホームの1ページ目だけ

<?php if( is_front_page() && ! is_paged() && (int) get_query_var( 'page', 1 ) < 2 ) : ?>
  ホームの1ページ目のみに表示させたいものをココに書く
<?php endif; ?>

さきほどの条件分岐は、トップページの2ページ目以降にも当てはまる場合があります。こちらは「トップページかつ先頭ページ」の例です。投稿一覧の2ページ目以降はis_paged()、静的フロントページ内のページ分割はpageクエリ変数で区別します。get_query_var()の既定値を1にして、未指定や1ページ目を含めています。

記事ページだけ

<?php if ( is_single() ) : ?>
  記事ページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

固定ページだけ

<?php if ( is_page() ) : ?>
  固定ページでのみ表示するものをココに
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

記事ページもしくは固定ページだけ

<?php if( is_singular( [ 'post', 'page' ] ) ) : ?>
  「投稿ページ」もしくは「固定ページ」で表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

この例ではis_singular()に通常投稿のpostと固定ページのpageを指定し、見出しの2種類に限定しています。引数を省くと、添付ファイルページやカスタム投稿タイプの個別ページも対象になります。

特定の記事ページだけ

<?php if( is_single('25') ) : ?>
  指定した記事でのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

投稿IDの調べ方条件分岐させたい記事の投稿編集画面(エディタ)を開いて、ブラウザ上のURLを見ます。?post=の後に続く数字が投稿IDです。

「この記事のときだけは表示するものを変えたい」「この記事のときだけ表示したい」というときに使います。例えば<?php if ( is_single('25') ) : ?>というように投稿IDを指定します。

特定の記事だけ(複数あるとき)

<?php if( is_single( array('5','15','100') ) ) : ?>
  指定した記事でのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

例えば、<?php if( is_single( array('5','15','100') ) ): ?>とすると「投稿IDが5、15、100のページ」と「それ以外のページ」で表示が切り替えられるようになります。,の数を増やせば、いくつでもまとめて指定することができます。

特定の固定ページだけ

<?php if( is_page('1') ) : ?>
  指定した固定ページでのみ表示するもの
<?php else: ?>
  それ以外のページで表示するもの
<?php endif; ?>

上の固定ページ版です。固定ページIDも同じく、編集画面のURLで調べられます。

複数あるとき

<?php if( is_page( array('1','5','9') ) ) : ?>
  指定した固定ページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

例えば<?php if( is_page( array('1','5') ) ): ?>というように書きます。

アーカイブページだけ

<?php if( is_archive() ) : ?>
  アーカイブページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>
公開当時の画面です。
アーカイブページ

アーカイブページとは、①カテゴリー別、②タグ別、③投稿者別、④日付別の記事一覧ページなどを指します。これらは代表例で、カスタム投稿タイプや独自タクソノミーのアーカイブも含まれます。

アーカイブの1ページ目のみ

<?php if( is_archive() && !is_paged() ) : ?>
  アーカイブの1ページ目でのみ表示するものをココに書く
<?php endif; ?>

is_paged()は「クエリによる記事一覧が2ページ目以降かどうか」を調べるWordPressの関数です。!is_paged()をアーカイブ条件と組み合わせることで、その一覧の先頭ページだけを判定できます。固定ページ内のページ分割を判定する例ではありません。

カテゴリー別の記事一覧ページのみ

<?php if( is_category() ) : ?>
  カテゴリーページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

カテゴリーの1ページ目のみ

<?php if( is_category() && !is_paged() ) : ?>
  カテゴリーの1ページ目でのみ表示するものをココに書く
<?php endif; ?>

特定のカテゴリーページのみ

<?php if( is_category('5') ) : ?>
  指定したカテゴリーページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

カテゴリー記事一覧ページの中でも「特定のカテゴリーの記事のみ」という条件にしたい場合には上記のように書きます。is_category('wordpress')のようにカテゴリーのスラッグ名で指定することもできます。

カテゴリーIDの調べ方WordPress管理画面の[投稿][カテゴリー]から条件分岐させたいカテゴリーの詳細ページを開きます。ブラウザ上のURLの中の&tag_ID=の後に続く数字がカテゴリーIDです。

特定のカテゴリーページのみ(複数)

<?php if( is_category( array('1', '3') ) ) : ?>
  指定したカテゴリーページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

複数のカテゴリーをまとめて指定したいときには、array()の中に半角カンマ,区切りで書きます。例えばif( is_category( array('1', '3', '6') ) ) :と書けば「カテゴリーIDが1、3、6の記事一覧ページであれば」という条件分岐になります。また、if( is_category( array('html', 'css', 'php') ) ) : というようにカテゴリーのスラッグ名で複数指定することもできます。

特定のカテゴリーに属する記事ページのみ

<?php if( is_singular( 'post' ) && in_category('5', get_queried_object_id() ) ) : ?>
  指定したカテゴリーに属する記事でのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>
公開当時の画面です。
特定のカテゴリーの記事のイメージ

こちらは、カテゴリーの記事一覧ではなく「指定カテゴリーに属する通常投稿の個別ページなら」という例です。is_singularで対象を絞り、get_queried_object_idで表示中の投稿IDを明示します。is_category('5')ではなくin_category( '5', get_queried_object_id() )で所属を調べます。Loop内で引数の投稿IDを省く場合は、現在の投稿を調べるため、一覧ページでも各投稿ごとに結果が変わります。表示中のページの判定とは区別しましょう。

特定のカテゴリーに属する記事(複数指定)

<?php if( is_singular( 'post' ) && in_category( array('1', '3'), get_queried_object_id() ) ) : ?>
  指定したカテゴリーに属するページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

こちらもカテゴリーIDの代わりに、カテゴリーのスラッグ名を書いてもOKです。in_category()は投稿へ割り当てられたカテゴリーを調べます。親カテゴリーだけを指定しても、その子カテゴリーのみが付いた投稿まで自動的に含まれるわけではありません。必要な子カテゴリーも配列へ指定してください。

カテゴリーごとにデザインを変える方法は別の記事で詳しくまとめました。

あわせて読みたいWordPressで条件分岐:カテゴリー別にデザインを変える3つの方法

タグ別の記事一覧ページのみ

<?php if( is_tag() ) : ?>
  タグページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

カテゴリーのときと考え方は同じです。「タグページもしくはカテゴリーページなら」という条件分岐にするにはif ( is_tag() || is_category() ) :と書きます。

特定のタグの記事一覧ページのみ

<?php if( is_tag('another') ) : ?>
  指定したタグページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

特定のタグを持つ記事ページのみ

<?php if( is_singular( 'post' ) && has_tag('another', get_queried_object_id() ) ) : ?>
  指定したタグを持つ記事ページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

タグIDの代わりにタグのスラッグ名を入れてもOKです。例えば「anotherというタグを作って、そのタグがつけられた記事ページだけ表示を切り替える」というようなことができるわけですね。その場合には、if ( is_singular( 'post' ) && has_tag( 'another', get_queried_object_id() ) ) :と書きます。has_tag()にも投稿IDを明示します。Loop内で投稿IDを省くと現在の投稿を調べる点はin_category()と同じです。

日付別の記事一覧ページのみ

<?php if( is_date() ) : ?>
  日・月・年別の記事一覧ページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

こちらはアーカイブの記事一覧ページのうち「日付別ページであれば」という指定になります。年別、月別、日別のどれもが含まれます。

年別の記事一覧ページのみ

<?php if( is_year() ) : ?>
  年別の記事一覧ページでのみ表示するものをココに書く
<?php endif; ?>

月別の記事一覧ページのみ

<?php if( is_month() ) : ?>
  月別の記事一覧ページでのみ表示するものをココに書く
<?php endif; ?>

日別の記事一覧ページのみ

<?php if( is_day() ) : ?>
  日別の記事一覧ページでのみ表示するものをココに書く
<?php endif; ?>

著者別の記事一覧ページのみ

<?php if( is_author() ) : ?>
  著者別の記事一覧ページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

if ( is_author( '4' ) ) :というように括弧内にユーザーIDを指定することで、特定の著者の記事一覧ページのみ表示を切り替えることができます。

モバイルとPCで表示切り替え

<?php if ( wp_is_mobile() ) : ?>
  モバイルからの閲覧時に表示するものをココに書く
<?php else: ?>
  PCからの閲覧時に表示するものをココに
<?php endif; ?>

モバイルにはタブレットも含まれますが、端末が送る情報によるため、すべてのスマホやiPadが必ず同じ側になるとは限りません。画面幅に応じたレイアウトはCSSのメディアクエリで調整します。この関数でHTMLの出力を変える場合は、モバイル用とそれ以外のキャッシュを分け、別の端末へ誤った表示が配られないようにしてください。

検索結果ページのみ

<?php if (  is_search() ) : ?>
  検索ページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

404ページのみ

<?php if (  is_404() ) : ?>
  404ページでのみ表示するものをココに書く
<?php else: ?>
  それ以外のページで表示するものをココに
<?php endif; ?>

このあたりはあまり使う機会は無いかもしれませんね。