wordpress

WordPressマスターへの遥かなる旅路② – 条件分岐タグを理解する

スタート地点が随分手前なため本当に遥かなる旅路になっておりますこのシリーズ、第一回目は


テンプレートタグについてざっくりまとめていました。
第二回の今回は前回もちょっと触れた条件分岐タグについて理解してみたいと思います。なんと前回の記事ではほぼ理解できていなかったんですね。

条件分岐タグですが会社のWordPress案件で当然のように登場します。
私のブログ程度の構築なら覚えてなくても何とかなりますが、業務として請けている仕事でいつまでも先輩の過去コーディングのソースから「うーん、これかな?」とコピペで持ってきているなんて恥ずかしくて大きな声では言えないのです。

条件分岐タグとは

条件分岐タグ (Conditional Tag) は、テンプレートファイル内で表示される内容や、特定のページ内容を表示する条件を設定するのに使います。例えば、ブログのホームページの上部に短い文を表示させたいとしましょう。is_home()を使えば、簡単に実行できます。

そうなのです。

基本的にif文で条件を記述していきます。
例えば、TOPページではリッチなグローバルナビを表示させるけど、それ以外の下層ページでは簡易化されたグローバルナビを表示させたい場合、

<?php if ( is_home() || is_front_page() ) : ?>
  //TOPページの場合に表示させるグロナビのソース
<?php else: ?>
  //それ以外のページの場合に表示させるグロナビのソース
<?php endif; ?>

という形になります。

他にも

  • TOPページのみメインビジュアルを表示させたい
  • ブログの記事詳細ページではフッターをシンプルにしたい
  • ページによってリード文を表示/非表示させたい
  • ページによってサイドメニューの表示内容を変更したい

などなど、頻出するのでやはりいい加減理解しておきたいと思います。

ちなみに、functions.phpには使えませんが、header.phpで特定のページのみに当てるCSSを読み込ませたいといった使い方もできます。

条件分岐タグ一覧

まず、ざっと表にします。よく使いそうなものをまとめました。

is_front_page() フロントページ(TOPページ)が表示されている場合
(固定ページのテンプレートデザインがフロントページに設定されている場合)
is_home() ブログ一覧ページが表示されている場合
(投稿ページがフロントページに設定されている場合)
is_page() 固定ページが表示されている場合
is_single() ブログの個別投稿ページ(記事詳細ページ)が表示されている場合
is_category() ブログのカテゴリー一覧(アーカイブ)ページが表示されている場合
in_category() ブログのカテゴリー配下の記事詳細ページが表示されている場合
is_tag() ブログのタグ一覧ページが表示されている場合
is_archive() ブログのアーカイブページが表示されている場合
is_tax() カスタムタクソノミー一覧ページが表示されている場合
is_post_type_archive() カスタム投稿タイプの一覧ページが表示されている場合
is_404() 404ページ(Not Foundページ)が表示されている場合
is_year() 年別ページが表示されている場合
月別はmonth、日別はday
has_post_thumbnail() アイキャッチ画像指定されている場合
elseの方に指定されていない場合に表示させるデフォルトの画像を指定する
wp_is_mobile() 訪問者がモバイル端末でアクセスしている場合

is_page()のカッコが思わせぶりですよね。なんと(?)中に指定を記述できるんです。

カッコの中に記述できる指定一覧

特定のID

ダミーで3というIDだとします。

is_page(3) 固定ページのID3のページを指定する場合
is_single(3) 個別投稿ページのID3のページを指定する場合
is_category(3) カテゴリーID3のアーカイブページを指定する場合
is_tag(3) タグのIDが3を指定する場合
<?php if ( is_page(3) ) : ?>
  //固定ページでIDが3のページの場合に実行する処理
<?php endif; ?>

特定のスラッグ

ダミーでslug-sampleというスラッグだとします。

is_page(‘slug-sample’) 固定ページでスラッグがslug-sampleのページを指定する場合
is_single(‘slug-sample’) 個別投稿ページでスラッグがslug-sampleのページを指定する場合
is_category(‘slug-sample’) スラッグがslug-sampleのアーカイブページを指定する場合
is_tag(‘slug-sample’) タグでスラッグがslug-sampleを指定する場合
<?php if ( is_single(‘slug-sample’) ) : ?>
  //個別投稿ページでスラッグがslug-sampleのページを指定する場合に実行する処理
<?php endif; ?>

特定のタイトル・名前

ダミーで初投稿です!というタイトル、タグやカテゴリー名だとします。

is_page(‘初投稿です!’) 固定ページでタイトルが「初投稿です!」のページを指定する場合
is_single(‘初投稿です!’) 個別投稿ページでタイトルが「初投稿です!」のページを指定する場合
is_category(‘初投稿です!’) カテゴリー名が「初投稿です!」のアーカイブページを指定する場合
is_tag(‘初投稿です!’) 「初投稿です!」というタグ名を指定する場合
<?php if ( is_page('初投稿です!') ) : ?>
  //固定ページでタイトルが「初投稿です!」のページを指定する場合に実行する処理
<?php endif; ?>

複数のページを指定する

これまで使ったダミーID、スラッグ、タイトルをここでも使用します。
複数の条件を指定するときは,区切りだよね?とやってみましたがうまくいきません。詳しくは分かりませんがarray()で挟むのがコツのようです。

is_page( array(3,’slug-sample’,’初投稿です!’) ) 固定ページでIDが3、あるいはスラッグがslug-sample、あるいはタイトルが「初投稿です!」のページを指定する場合
is_single( array(3,’slug-sample’,’初投稿です!’) ) 個別投稿ページでIDが3、あるいはスラッグがslug-sample、あるいはタイトルが「初投稿です!」のページを指定する場合
is_category( array(3,’slug-sample’,’初投稿です!’) ) カテゴリーIDが3、あるいはカテゴリースラッグがslug-sample、あるいはカテゴリー名が「初投稿です!」のアーカイブページを指定する場合
is_tag( array(3,’slug-sample’,’初投稿です!’) ) タグIDが3、あるいはタグのスラッグがslug-sample、あるいはタグ名が「初投稿です!」のアーカイブページを指定する場合
<?php if ( is_tag( array(3,'slug-sample','初投稿です!') ) ) : ?>
  //タグIDが3、あるいはタグのスラッグがslug-sample、あるいはタグ名が「初投稿です!」のアーカイブページを指定する場合に実行する処理
<?php endif; ?>

ここまで、カテゴリーやタグでもそれぞれ細かく指定する例を上げてきましたが、アーカイブページをひとまとめに指定したい場合は素直にis_archive()を使いましょう。

カスタム投稿タイプで指定する場合

is_post_type_archive()is_tax()の場合も、前述した例のように、タイプ名、カスタム分類名、複数の指定ができます。

<?php if ( is_post_type_archive( array('sample01','sample02') ) ) : ?>
  //投稿タイプ名が「sample01」、あるいは「sample02」のカスタム投稿のアーカイブページを指定する場合に実行する処理
<?php endif; ?>

条件分岐タグの書き方

条件分岐が増えるごとにif文に追記していく

case1: 条件が1つ

<?php if ( 条件1 ) : ?>
  //条件1の場合に実行する処理
<?php endif; ?>

case2: 条件が2つ(条件1かそれ以外か)

それ以外の場合はelse(訳:でなければ)を使います。

<?php if ( 条件1 ) : ?>
  //条件1の場合に実行する処理
<?php else: ?>
  //それ以外の場合に実行する処理
<?php endif; ?>

case3: 条件が3つ(条件1か条件2かそれ以外か)

elseを増やしていけばいいと勘違いしちゃいますが、elseifで次の条件分岐を増やします。

<?php if ( 条件1 ) : ?>
  //条件1の場合に実行する処理
<?php elseif ( 条件2 ) : ?>
  //条件1じゃなかった場合で条件2の場合に実行する処理
<?php else : ?>
  //いずれでも無い場合に実行する処理
<?php endif; ?>

case4: 条件が3つ(条件1か条件2か条件3か)

case3と異なり、いずれでも無い場合=それ以外全部!というざっくり条件ではなく、さらに条件3を設定するケースです。

<?php if ( 条件1 ) : ?>
  //条件1の場合に実行する処理
<?php elseif ( 条件2 ) : ?>
  //条件1じゃなかった場合で条件2の場合に実行する処理
<?php elseif ( 条件3 ) : ?>
  //条件1でも条件2でもなく場合で条件3の場合に実行する処理
<?php endif; ?>

条件を増やす場合はelseifでどんどん増やしていけばいいんですね。
しかし条件が複雑になるとどんどん記述が長くなり、式が汚くなってしまいます。そんな場合に下記のやり方を取り入れるといいかもしれません。

複数条件を指定する

ExcelにIF関数ってありますよね。
AND関数「なおかつ」、OR関数「または」、NOT関数「~ではない」。
これ、WordPressでも使えるんです。

case5: 条件1なおかつ条件2の場合

ExcelでいうところのAND関数「なおかつ」です。

<?php if ( 条件1 && 条件2 ) : ?>
  //条件1なおかつ条件2の場合に実行する処理
<?php endif; ?>

case6: 条件1または条件2の場合

ExcelでいうところのOR関数「または」です。

<?php if ( 条件1 || 条件2 ) : ?>
  //条件1または条件2の場合に実行する処理
<?php endif; ?>

case7: 条件1ではない場合

ExcelでいうところのNOT関数「~ではない」です。

<?php if ( ! 条件1 ) : ?>
  //条件1ではない場合に実行する処理
<?php endif; ?>

入れ子もできる

複数条件を駆使しても上手く該当条件を指定できないこともあります。
例えば、PCからTOPページにアクセスしたときある画像をプリロードさせたい場合、wp_is_mobile()かつis_front_page()elseにしたら……ダメですね。あーしてこーして、うーん……と知恵熱が出そうになってしまいます。(rel="preload"にmedia属性を指定すればいいかもしれませんが、ちょっとそれは置いておいて)
素直に入れ子にできるんです!

<?php if ( 条件A ) : ?>
  <?php if ( 条件B ) : ?>
    //条件Aかつ条件Bの場合に実行する処理
  <?php else: ?>
    //条件Aだが条件B以外の場合に実行する処理
  <?php endif; ?>
<?php endif; ?>

あとがき

なるほど。今までの食わず嫌い(難しそうだから視線をそらす)は何だったのかという気分になっています。
今回基本的な部分をまとめただけですが、やはり記事にまとめると理解が進みますね。

「応用: 条件分岐タグ一覧と条件分岐タグの書き方を組み合わせる」を後日追記する予定です。