WordPressでサイトを構築する際、必ず使うことになるのが条件分岐タグです。
条件分岐タグを使えばページごとにレイアウトを変えたり、特定の条件に合致した場合のみコンテンツを表示させたりということができます。
このページではよく使う条件分岐タグと、そのいろいろな使い方についてまとめています。
まずは条件式の書き方をおさらい
WordPressの条件分岐は、PHPのif文を使って書きます。
ですので、まずはif文の基本的な書き方についておさらいしておきます。
論理値
<?php if($post_type): //$post_typeがTRUEの場合 ?>
//TRUEのとき
<?php endif; ?>
<?php if(!$post_type): //$post_typeがFALSEの場合 ?>
//FALSEのとき
<?php endif; ?>
$post_typeに値が代入されているか判定して処理を分岐します。
カスタムフィールドとかで「未入力の場合は非表示」というようなときによく使われたりします。
<?php if(get_field('data')): ?>
<?php the_field('data'); ?>
<?php endif; ?>
比較演算子
<?php if($post_type == 'works'): //$post_typeの値が「works」の場合 ?>
//「works」のとき
<?php endif;?>
<?php if($post_type !== 'works'): //$post_typeの値が「works」でない場合 ?>
//「works」でないとき
<?php endif;?>
「AがBなら」という形で判定して処理を分岐します。
以下のようにして複数の条件を判定することもできます。
<?php if( $post_type == 'works' ): //$post_typeの値が「works」の場合 ?>
//「works」のとき
<?php elseif( $post_type == 'voice' ): //$post_typeの値が「voice」の場合 ?>
//「voice」のとき
<?php else: //それ以外の場合 ?>
//それ以外のとき
<?php endif; ?>
論理演算子
<?php if($post_type == 'works' && $post_name == 'voice'): //$post_typeの値が「works」かつ$post_nameの値が「voice」の場合 ?>
//$post_typeが「works」かつ$post_nameが「voice」のとき
<?php endif; ?>
<?php if($post_type == 'works' || $post_type == 'voice'): //$post_typeの値が「works」もしくは$post_nameの値が「voice」の場合 ?>
//$post_typeが「works」または「voice」のとき
<?php endif; ?>
「かつ/もしくは」という形で条件を指定できます。
「&&」の場合は条件を2つとも満たす場合、「||」の場合はどちらか一方の条件を満たす場合に処理されます。
よく使うWordPress条件分岐タグといろいろな使い方
それでは次に、WordPressでサイトを構築する際によく使う条件分岐タグと、それらのいろいろな使い方についてまとめていきます。
ホームページ(トップページ)
<?php if(is_front_page() && is_home()): //デフォルトのホームページの場合 ?>
//「表示設定」→「ホームページの表示」が「最新の投稿」の場合
<?php elseif(is_front_page()): //固定ページを使ったホームページの場合 ?>
//「表示設定」で「ホームページ」を設定した場合のホームページ
<?php elseif(is_home()): //固定ページを使った投稿ページの場合 ?>
//「表示設定」で「投稿ページ」を設定した場合の投稿ページ
<?php else: //それ以外の場合 ?>
//それ以外の場合
<?php endif; ?>
ホームページのみで処理を行いたい場合はis_front_page()とis_home()を使います。
この2つは違いがよく分からないと言われることが多いですが、以下のポイントを把握しておくと理解しやすいかと思います。
- WordPressの表示設定がデフォルト(管理画面「設定」→「表示設定」→「ホームページの表示」が「最新の投稿」の状態)の場合、ホームページを判定する条件分岐タグはない。そのため、is_front_page()とis_home()を併用する必要がある。
- 「表示設定」→「ホームページの表示」で「ホームページ」と「投稿ページ」を設定した場合、「ホームページ」はis_front_page()で判定することができ、「投稿ページ」はis_home()で判定することができる。
さらに言い換えると、以下のようになります。
is_front_page()とis_home()の違い
- デフォルト
- is_front_page()→ホームページでTRUE
- is_home()→ホームページでTRUE
- ホームページあり/投稿ページなし
- is_front_page()→ホームページでTRUE
- is_home()→ホームページでFALSE
- ホームページあり/投稿ページあり
- is_front_page()→ホームページでTRUE
- is_home()→ホームページでFALSEかつ投稿ページでTRUE
合わせてテンプレート階層も確認すると分かりやすいかもしれません。
- 参考URL
- テンプレート階層
固定ページ
<?php if(is_page()): //固定ページの場合 ?>
//固定ページの場合
<?php endif; ?>
<?php if(is_page(6)): //IDが「6」の固定ページの場合 ?>
//IDが「6」の固定ページの場合
<?php endif; ?>
<?php if(is_page('contact')): //スラッグが「contact」の固定ページの場合 ?>
//スラッグが「contact」の固定ページの場合
<?php endif; ?>
<?php if(is_page(array('contact','recruit'))): //スラッグが「contact」または「recruit」の固定ページの場合 ?>
//スラッグが「contact」または「recruit」の固定ページの場合
<?php endif; ?>
<?php if(is_page(array(6, 'about'))): //ID「6」またはスラッグ「about」の固定ページの場合 ?>
//ID「6」またはスラッグ「about」の固定ページの場合
<?php endif; ?>
個別投稿ページ(シングルページ)
<?php if(is_single()): //個別投稿ページの場合 ?>
//個別投稿ページの場合
<?php endif; ?>
<?php if(is_single(6)): //IDが「6」の個別投稿ページの場合 ?>
//IDが「6」の個別投稿ページの場合
<?php endif; ?>
<?php if(is_single('privacy')): //スラッグが「privacy」の個別投稿ページの場合 ?>
//スラッグが「privacy」の個別投稿ページの場合
<?php endif; ?>
<?php if(is_single(array(6, 'hello'))): //IDが「6」またはスラッグが「hello」の個別投稿ページの場合 ?>
//IDが「6」またはスラッグが「hello」の個別投稿ページの場合
<?php endif; ?>
<?php if(is_single() && has_post_thumbnail()): //個別投稿ページにアイキャッチ画像が設定されている場合 ?>
//個別投稿ページにアイキャッチ画像が設定されている場合
<?php endif; ?>
個別投稿ページが特定のカテゴリーに属している場合
特定のカテゴリーに属している個別投稿ページのみ表示を変えたいというようなときは、in_category()を使います。
<?php if(in_category(6)): //個別投稿ページがID「6」のカテゴリーに属している場合 ?>
//個別投稿ページがID「6」のカテゴリーに属している場合
<?php endif; ?>
<?php if(in_category('news')): //個別投稿ページが「news」というスラッグのカテゴリーに属している場合 ?>
//個別投稿ページが「news」というスラッグのカテゴリーに属している場合
<?php endif; ?>
<?php if(in_category(array('news', 'topics'))): //「news」または「topics」というスラッグのカテゴリーに属している場合 ?>
//「news」または「topics」というスラッグのカテゴリーに属している場合
<?php endif; ?>
<?php if(in_category(array(6, 'news'))): //個別投稿ページがID「6」または「news」というスラッグのカテゴリーに属している場合 ?>
//個別投稿ページがID「6」または「news」というスラッグのカテゴリーに属している場合
<?php endif; ?>
個別投稿ページがタグ付けされている場合
<?php if(has_tag()): //個別投稿ページがタグ付けされている場合 ?>
//個別投稿ページがタグ付けされている場合
<?php endif; ?>
<?php if(has_tag('hair')): //個別投稿ページにスラッグが「hair」のタグが付けられている場合 ?>
//個別投稿ページにスラッグが「hair」のタグが付けられている場合
<?php endif; ?>
<?php if(has_tag(array('hair', 'makeup', 'nail'))): //スラッグ「hair」「makeup」「nail」のいずれかのタグが付けられている場合 ?>
//スラッグ「hair」「makeup」「nail」のいずれかのタグが付けられている場合
<?php endif; ?>
アーカイブページ
<?php if(is_archive()): //アーカイブページの場合 ?>
//アーカイブページの場合
<?php endif; ?>
アーカイブページとは、以下のような記事一覧ページのことです。
- カテゴリーページ
- タグページ
- タクソノミーページ
- カスタム投稿タイプアーカイブ
- 作成者ページ
- 日付別ページ
is_archive()はパラメータがないため、スラッグなどで絞り込むことはできません。
カテゴリーページ
<?php if(is_category()): //カテゴリーページの場合 ?>
//カテゴリーページの場合
<?php endif; ?>
<?php if(is_category(6)): //IDが「6」のカテゴリーページの場合 ?>
//IDが「6」のカテゴリーページの場合
<?php endif; ?>
<?php if(is_category('news')): //スラッグが「news」のカテゴリーページの場合 ?>
//スラッグが「news」のカテゴリーページの場合
<?php endif; ?>
<?php if(is_category(array(6, 'topics'))): //ID「6」またはスラッグが「news」のカテゴリーページの場合 ?>
//ID「6」またはスラッグが「news」のカテゴリーページの場合
<?php endif; ?>
タグページ
<?php if(is_tag()): //タグページの場合 ?>
//タグページの場合
<?php endif; ?>
<?php if(is_tag(6)): //IDが「6」のタグページの場合 ?>
//IDが「6」のタグページの場合
<?php endif; ?>
<?php if(is_tag('hair')): //スラッグが「hair」のタグページの場合 ?>
//スラッグが「hair」のタグページの場合
<?php endif; ?>
<?php if(is_tag(array('hair', 'makeup', 'nail'))): //スラッグが「hair」「makeup」「nail」のいずれかのタグページの場合 ?>
//スラッグが「hair」「makeup」「nail」のいずれかのタグページの場合
<?php endif; ?>
作成者ページ
<?php if(is_author()): //作成者ページの場合 ?>
//作成者ページの場合
<?php endif; ?>
<?php if(is_author(6)): //ID「6」の作成者ページの場合 ?>
//ID「6」の作成者ページの場合
<?php endif; ?>
<?php if(is_author('tanaka')): //ナイスネームが「tanaka」の作成者ページの場合 ?>
//ナイスネームが「tanaka」の作成者ページの場合
<?php endif; ?>
<?php if(is_author(array(8, 'tanaka', '田中'))): //ID「8」ナイスネーム「tanaka」ニックネーム「田中」のいずれかの場合 ?>
//ID「8」ナイスネーム「tanaka」ニックネーム「田中」のいずれかの場合
<?php endif; ?>
ナイスネーム(user_nicename)はユーザー名(user_login)を元に自動で設定されるため、通常はユーザー名と同じになっています。
ナイスネームはWordPress管理画面に表示されませんが、データベースのwp_usersテーブルまたは作成者ページURL(https://bambooworks.co/author/user_nicename/)にて確認することができます。
日付別ページ
<?php if(is_date()): //日付別ページの場合 ?>
//日付別ページの場合
<?php endif; ?>
<?php if(is_month()): //月別ページの場合 ?>
//月別ページの場合
<?php endif; ?>
<?php if(is_year()): //年別ページの場合 ?>
//年別ページの場合
<?php endif; ?>
検索結果ページ
<?php if(is_search()): //検索結果ページの場合 ?>
//検索結果ページの場合
<?php endif; ?>
404ページ
<?php if(is_404()): //404ページの場合 ?>
//404ページの場合
<?php endif; ?>
is_404()で404エラー時の設定をすることができますが、ページテンプレート(404.php)を用意した方がメンテナンスしやすいのでおすすめです。
カスタム投稿タイプアーカイブページ
<?php if(is_post_type_archive('hair')): //スラッグが「hair」のカスタム投稿タイプアーカイブページの場合 ?>
//スラッグが「hair」のカスタム投稿タイプアーカイブページの場合
<?php endif; ?>
<?php if(is_post_type_archive(array('hair', 'makeup', 'nail'))): //スラッグが「hair」「makeup」「nail」のいずれかの場合 ?>
//スラッグが「hair」「makeup」「nail」のいずれかの場合
<?php endif; ?>
is_post_type_archive()を使うには、register_taxonomy関数で「’has_archive’ => true」としている必要があります。
カスタム投稿タイプシングルページ
<?php if(is_singular('hair')): //スラッグが「hair」のカスタム投稿タイプシングルページの場合 ?>
//スラッグが「hair」のカスタム投稿タイプシングルページの場合
<?php endif; ?>
<?php if(is_singular(array('hair', 'makeup', 'nail'))): //スラッグが「hair」「makeup」「nail」のいずれかの場合 ?>
//スラッグが「hair」「makeup」「nail」のいずれかの場合
<?php endif; ?>
便宜上カスタム投稿タイプのシングルページとしていますが、IDやスラッグを指定することで標準の個別投稿ページ(シングルページ)や固定ページにも適用させることができます。
<?php if(is_singular('post')): //個別投稿ページの場合 ?>
//個別投稿ページの場合
<?php endif;?>
<?php if(is_singular('page')): //固定ページの場合 ?>
//固定ページの場合
<?php endif;?>
しかしis_single()とis_page()があるため、実際に使うケースはほぼありません。
カスタム投稿タイプのアーカイブページとシングルページを一括で分岐させる場合
たとえばヘッダー画像を投稿タイプごとに変更したいとかで、アーカイブページとシングルページを一括で分岐させたい場合があります。
その場合は以下のようにします。
<?php if(is_post_type_archive('artist') || is_singular('artist')): //スラッグ「artist」のカスタム投稿タイプのページの場合 ?>
//スラッグ「artist」のカスタム投稿タイプのページの場合
<?php endif;?>
タクソノミーを設定している場合には、タクソノミーページもまとめて分岐させるといいかもしれません。
<?php if(is_post_type_archive('artist') || is_tax('hair') || is_singular('artist')): //カスタム投稿タイプ「artist」のページの場合 ?>
//カスタム投稿タイプ「artist」のページの場合
<?php endif;?>
タクソノミーページ
<?php if(is_tax()): //タクソノミーページの場合 ?>
//タクソノミーページの場合
<?php endif;?>
<?php if(is_tax('cut')): //スラッグが「cut」のタクソノミーページの場合 ?>
//スラッグが「cut」のタクソノミーページの場合
<?php endif;?>
<?php if(is_tax(array('cut', 'color'))): //スラッグが「cut」「color」いずれかのタクソノミーページの場合 ?>
//スラッグが「cut」「color」いずれかのタームアーカイブページの場合
<?php endif;?>
タームアーカイブページ
<?php if(is_tax('タクソノミースラッグ', 'タームスラッグ')): ?>
タームアーカイブも、上記のような形でis_tax()によって分岐できます。
<?php if(is_tax('cut', 'men')): //タクソノミー「cut」にあるスラッグが「men」のタームアーカイブページの場合 ?>
//タクソノミー「cut」にあるスラッグが「men」のタームアーカイブページの場合
<?php endif;?>
<?php if(is_tax('cut', array('men', 'women'))): //タクソノミー「cut」にある「men」「women」いずれかのタームアーカイブページの場合 ?>
//タクソノミー「cut」にある「men」「women」いずれかのタームアーカイブページの場合
<?php endif;?>
アイキャッチ画像
<?php if(has_post_thumbnail()): //アイキャッチ画像が設定されていれば表示 ?>
<?php the_post_thumbnail('rect768', array('alt' => get_the_title())); // ?>
<?php else: //アイキャッチ画像が設定されていなければ代替画像を表示 ?>
<img src="<?php get_stylesheet_directory_uri(); ?>/images/rect900.png" alt="<?php get_the_title(); ?>" />
endif; ?>
条件分岐とは直接関係ありませんが、get_stylesheet_directory_uri()は有効化されているテーマのstyle.cssがあるディレクトリ(フォルダ)URIを出力するものです。
似たものにget_template_directory_uri()がありますが、これは常に親テーマのディレクトリURIを出力します。
そのため子テーマでget_template_directory_uri()を使うことで、親テーマのファイルを表示することもできます。
用途に合わせて使い分けるとよいかと思います。
2ページ目以降のページ
<?php if(is_paged()): //2ページ目以降のページの場合 ?>
//2ページ目以降のページの場合
<?php endif;?>
is_paged()でアーカイブページなど、複数に渡るページの2ページ目以降を分岐できます。
これを使って、1ページ目だけ表示を変えるという方法もよく使います。
<?php if(is_home() && !is_paged()): //投稿ページの1ページ目の場合 ?>
//投稿ページの1ページ目の場合
<?php endif;?>
まとめ
以上、よく使うWordPress条件分岐タグといろいろな使い方まとめでした。
条件分岐タグは今回ご紹介したもの以外にもたくさんあるのですが、すべて覚える必要はありません。
「こんなのあったな」と何となく思い出せる程度で頭に入れておき、必要になったら詳しく調べるという感じで大丈夫だと思います。