WordPressのテーマ作成で利用する条件分岐まとめ

WordPressの条件分岐は、テーマ作成をする際にちょっとしたプログラムを作成する場合でも利用します。非常に細かく判別できるようWP関数が数多く用意されているため、覚えておくと便利かと思います。現在表示しているのが投稿ページなのか固定ページなのかなどの表示に関する条件分岐からユーザーがログインしているか、指定するタームは存在するのかなどの条件分岐まで、WordPressにおけるよく利用しそうな条件分岐をまとめました。

WordPressのテーマ作成で利用する条件分岐まとめ

作成日
2017/04/05
更新日
2017年7月11日

WordPressの条件分岐は、テーマ作成をする際にちょっとしたプログラムを作成する場合でも利用します。非常に細かく判別できるようWP関数が数多く用意されているため、覚えておくと便利かと思います。また条件分岐の関数があると知っているだけで手間を省くことにもつながります(この記事を書くきっかけとなった「taxonomy_exists()」を知らなかった私は該当タクソノミーから全てのタームを取得してin_array()で判別していました…)。現在表示しているのが投稿ページなのか固定ページなのかなどの表示に関する条件分岐からユーザーがログインしているか、指定するタームは存在するのかなどの条件分岐まで、WordPressにおけるよく利用しそうな条件分岐をまとめました。

目次

トップページの表示に関する条件分岐

トップページかどうかを表示する関数は「is_front_page()」と「is_home()」の2つあります。どちらで判別するかは管理画面の「設定」>「表示設定」>「フロントページの表示」の設定に関係があります。この設定が「最新の投稿」(デフォルト)に設定されている場合はどちらも利用できますが、「固定ページ」に設定されている場合は、どのような表示の場合に「true」を返すのかが変わってきます。基本的にサイトアドレスを表示している場合を判別したい場合には「is_front_page()」を使うとよさそうです。「is_home()」は「固定ページでフロントページ」が設定されている場合、サイトアドレスにおいては「false」になってしまいます。
ここからは蛇足ですが、WordPressはもともとブログとして開発されたため、通常はサイトのフロントページ(トップページ)は最新の投稿一覧となります。しかしコーポレートサイトでの利用などを考えると、固定ページをサイトのフロントページとして表示させたい場合もあると思います。WordPressではそういったケースにも考慮されており、フロントページを固定ページとして、投稿一覧ページは別の固定ページとして設定できるようになっています。この設定の場合のために「is_home()」が存在します。

is_front_page(), is_home() : トップページを表示する際の分岐

ややこしい場合は、とりあえずフロントページは「is_front_page()」を使い、投稿一覧ページは「is_home()」を使うようするといいかもしれません。
通常のフロントページを固定ページにしないやり方であればどちらでも構いません。

個別ページの表示に関する条件分岐

投稿(カスタム投稿タイプ)の詳細ページや、個別ページが表示されているかどうかを判別するための条件分岐になります。
個別ページを判別するWP関数は「is_singular()」や「is_single()」、「is_page()」などがありますが、「is_singular()」は他の分岐より広義であり、投稿タイプを問わず個別ページを表示しているかどうかのみを判別するため、いくつかの条件を設定する際は条件分岐を行うタイミングに注意が必要です。

is_singular() : 個別ページが表示されているかどうか

投稿、カスタム投稿タイプ、固定ページの詳細ページかどうかを判別します。
また、引数を入れることで投稿タイプを指定することができます。投稿の詳細ページが表示されているかどうかを調べたいならば「is_singular(‘post’)」、固定ページが表示されているかどうかを調べたいならば「is_singular(‘page’)」、カスタム投稿タイプの名前が例として「topics」なら「is_singular(‘topics’)」となります。また、配列を入れることにより複数指定することが可能です。
固定ページは「is_page()」が用意されていますが、デフォルトで用意されている投稿タイプ「post」の詳細ページのみを判別する関数は無いので、そういった場合に便利かもしれません。

is_single() : 投稿(カスタム投稿タイプ)の個別ページが表示されているかどうか

投稿、またはカスタム投稿タイプの個別ページが表示されているかどうかを判別します。
引数に「投稿ID」や「タイトル」、「スラッグ」を入れることで該当の投稿を判別することができます。Codexによると、IDのつもりで「19」のような数値を引数に指定した場合は、投稿IDの「19」とスラッグの「19」を区別しないそうなので注意が必要です。恐らくタイトルとスラッグも同じ場合は区別しなさそうですが未確認です。

is_page() : 固定ページが表示されているかどうか

固定ページが表示されているか判別します。
投稿と同じように引数に「投稿ID」や「タイトル」、「スラッグ」を指定することで該当のページに判別を狭めることができます。

アーカイブページの表示に関する条件分岐

一覧ページの判別は「is_archive()」ですが、WordPressには様々なアーカイブの表示を用意しており、条件分岐もさらに細かい判別が可能です。
ここでは一覧ページが表示されている場合に利用できる条件判別を記載します。

is_archive() : アーカイブページが表示されているかどうか

「is_archive()」は一覧ページ判別の中でも一番大きな分類です。「is_singular()」が個別ページ全てを通すのに対し、「is_archive()」は日付アーカイブだろうがカテゴリーアーカイブだろうがカスタム投稿タイプアーカイブだろうが一覧ページであれば全てをtrueを返します。もしカテゴリーの場合とカスタム投稿タイプアーカイブの場合とで分けたい場合は順番に注意が必要です。

is_post_type_archive() : カスタム投稿タイプのアーカイブページが表示されているかどうか

カスタム投稿タイプは、その登録をする際にアーカイブページを設けるかどうかを指定できます。もししていた場合、指定のパーマリンク設定によりアーカイブページが表示されるのですが、その判別に利用できるのが「is_post_type_archive()」です。

is_date()、is_year()、is_month()、is_day() : 日付のアーカイブページが表示されているかどうか

日付関連のアーカイブページを判別します。「is_date()」はこれらの中で一番大きなくくりになり、「年別」や「月別」、「日別」の場合でもtrueを返します。
逆に言えば、どれか一つがtrueの場合は「is_date()」は常にtrueです。
余談ですが、このあたり、WordPressはリクエストされたURLから判断しているので、「2017」だとか、「10」だとかいうスラッグは固定ページや投稿ページに指定しない方がいいことが分かります。「2017」というスラッグの固定ページがあった場合、「http://xxx.xxx/2017/」のページを開こうとすると、年別アーカイブとしてではなく、固定ページとして判断されるので、「is_year()」は「false」となり逆に「is_page()」がtrueになってしまいます
と、試しに固定ページのスラッグを「2017」に変更しようとしたところ、自動で「2017-2」となりました。数字を受け入れないのか、「1960」でも「1960-2」となり、「3000」でも「3000-2」となり、「10」でも「5」でも「30000」でも最後に「-2」がつくようになっていました。前はこんな設定ではなかったような気もしますが、さすがWordPressですね。

is_tax() : カスタムタクソノミーのアーカイブページが表示されているかどうか

カスタムタクソノミーアーカイブを判別する時は「is_tax()」を使います。第一引数にタクソノミー名を入れることでタクソノミーを指定し、第二引数にターム名を入れるとタームを指定します。注意点としては、デフォルトで存在するタクソノミー「category」一覧の場合は「is_tax()」はfalseが返されるとのことです。
また余談ですが、タクソノミーとタームは、なじみのない言葉だったので最初イメージがつかず嫌いでした。分類を表す言葉として馴染み深い「カテゴリー」というものはデフォルトのタクソノミーとして利用されているため、ちょうどいい名前の付け方がなかったのでしょうかね。
私の場合、ECショップを思い浮かべこの辺を覚えました。「色」や「サイズ」がタクソノミーにあたり、「赤」「青」や「S」「M」がタームにあたります。

is_category() : カテゴリーのアーカイブページが表示されているかどうか

カテゴリー一覧ページかどうかを判別するには「is_category()」を利用します。引数に値を入れることで、該当のカテゴリー一覧かどうかを条件分岐できます。指定は「ID」「カテゴリー名」「カテゴリースラッグ」のようです。
これも余談ですが、「is_category()」を利用して、もしカテゴリーIDが「1」の場合はこのテンプレートを読むこむといった処理をたまにオリジナルテーマで見かけますが、カテゴリーを追加する度にテーマを変更しなくてはいけないため保守性が悪い気もします。カテゴリーによって何を切り替えるかによりますが、CSSで済む話ならカテゴリースラッグを大枠のタグにIDとして埋め込めばいいですし、背景画像や画像も読み込むファイルをスラッグ名にすれば可能です。文章ならカテゴリーの説明文もありますし、カテゴリースラッグとメディアのファイル名を結び付けることもできるそうです。プラグインを利用するなら「Advanced Custom Field」などでカテゴリーにメタ情報を簡単に設定できるようになります。

is_tag() : タグのアーカイブページが表示されているかどうか

タグのアーカイブページ一覧を条件分岐で判別する場合には「is_tag()」を利用します。普段あまりタグを利用しないのですが、見たところカテゴリーと一緒でしょうか。

その他の表示に関する条件分岐

表示に関する条件分岐として上記にいろいろ載せましたが、他にも利用できそうなものがあります。

is_admin() : 管理画面が表示されているかどうか

テーマの作成というよりプラグインの方に近いかもしれませんが、「is_admin()」は管理画面が表示されている場合を条件分岐として判別してくれます。
Codexにも書いてありましたが、ログインの有無や権限などのチェックは行っていないそうなので、その辺の判別もしたい場合は別のWP関数と併用する流れになるでしょうか。

is_author() : 著者ページが表示されているかどうか

著者ページが表示されているかを条件分岐として判別するには「is_author()」を利用します。引数により「ID」や「ニックネーム」、「ナイスネーム」によって条件分岐することができます。
またまた余談ですが、個人的に英語と日本語の関係で「姓」と「名」が逆だったりとこの辺のメタ情報まわりの構成はあまり好きではありません。

is_search() : 検索結果ページが表示されているかどうか

検索ページの判断になります。検索ワードなどをタイトル入れたいなどの場合に利用できそうですね。

is_404() : 404ページが表示されているかどうか

404エラーのページが表示されている場合、「is_404()」はtrueを返します。

ユーザーに関する条件分岐

ユーザーに関する条件分岐をまとめてみました。エンドユーザーが何かしらユーザー登録できるシステムや、会員制サイトの際など、様々なケースで必要になってくると思います。

is_user_logged_in() : ユーザーがログインしているか(ログインの判別)

ユーザーがログインしているかどうかの判別です。ログインユーザーのみに表示をさせたい項目がある場合などに利用できます。
ログイン情報を元に表示させたい場合にも、先に「is_user_logged_in()」の条件分岐を挟んだ方がベターだと思います。

user_can() : 指定したユーザーは指定した権限グループか、または権限を持っているか

ユーザーIDを指定し、そのユーザーが権限を持っているかを判別することができます。
ユーザーIDの取得は別のWP関数などで行う必要があります。

current_user_can() : ログインしているユーザーは指定した権限グループか、または権限を持っているか

現在ログインしているユーザーが権限を持っているかを判別します。上記の「is_user_logged_in()」と「user_can()」を合わせた感じでしょうか。

email_exists() : 指定したメールアドレスが登録されているか(ユーザーIDを返す)

メールが登録されているかを判別し、存在すればユーザーIDを返します。会員制やユーザーの機能を利用したシステムで色々使えそうですね。
新規ユーザー登録あたりはコアなシステムやプラグインに任せるとしても、返り値を利用してメールアドレスからユーザー情報を引っ張る、ログインしているユーザーIDと同じメールアドレスを入力しているかどうかの判別など、便利そうです。
例えばユーザー同士の交流ができる掲示板サイトをWordPressで構築したとします。ユーザーが作成した掲示板に誰かのメールアドレスから招待したい場合、この条件分岐を行えば、「既に登録済み」>「招待が来た旨のメッセージ」、「未登録」>「ユーザー登録のメール」というシステムの流れをくむことができます。

投稿タイプに関する条件分岐

投稿タイプに関する条件分岐では、投稿タイプが存在するかや、現在の投稿の投稿タイプで条件分岐を行いたい場合などを記述します。

post_type_exists() : 投稿タイプが存在するか

投稿タイプが存在するかをチェックする関数です。
恐らくリクエストからの判断に利用されているものだと思いますが、例えばオリジナルの検索機能を付けて、投稿タイプの絞り込みフォームを作成した際などに、検索者が投稿タイプとしての正しい値を入れているか判断するのに利用できそうです。あとは自動で投稿タイプを作るシステムを組み込んでいるときでしょうか?プラグインの有効化の際に判断するのはありそうですが。

現在の投稿が指定した投稿タイプかどうか

現在の投稿が指定した投稿タイプかを条件分岐するためには「is_post_type()」と言いたいところですが、存在しないようです。
しかし、詳細ページ、アーカイブページで分けるならば投稿タイプの条件分岐は可能です。例えば「works」という投稿タイプがあったとして、「is_singular(‘works’)」で「works」のシングルページかどうか、「is_archive(‘works’)」で「works」のアーカイブページかどうかを判断することが可能です。
しかし、独自ループなどで投稿タイプが混在し、投稿タイプを取得したいことはあると思います。そうした場合には「get_post_type()」を利用して投稿タイプを取得したのち、それが「works」かどうかを判断する流れです。
また、ループ外で取得したい場合は「get_query_var(‘post_type’)」を利用してクエリから投稿タイプを取得できます。

カテゴリーに関する条件分岐

カテゴリーに関する条件分岐では、タクソノミー関連も一緒にまとめたいと思っています。

in_category() : 投稿が指定したカテゴリーに属するか

「in_category()」は投稿がカテゴリーに属するかを判断します。カテゴリーに属するかという条件分岐なので、第一引数にカテゴリーを指定しなくてはなりません(必須)。第二引数に投稿IDを指定することができます。
よく記事で見かける話になってしまいますが、「in」と「is」は違います。同じことを書いてもあれなのでナメた感じに書くと以下のような感じでしょうか。
is_category(8)の場合、
ここってカテゴリー8だよね
→ うん、そうだよ! > true
→ 違うよ… > false
in_category(8,25)の場合、
投稿「25」さんってカテゴリー8に入ってるよね
→ うん、入ってる! > true
→ 違うよ、嘘つき! > false
と、クエリに対してカテゴリーを判別したい場合と、投稿に対してカテゴリーを判別したい場合と別れていることが分かるかと思います。一文字しか違いませんが。

文字列に対する条件分岐

is_email() : 指定した文字列がメール形式かどうか

if(is_email($my_mail)){
//変数「$my_mail」が、メールアドレス式の文字列の場合
}

is_serialized() : 指定した文字列がリアライズされているかどうか

if(is_serialized($serialize_text)){
//変数「$serialize_text」がシリアライズされている場合
}

ファイルに対する条件分岐

指定したファイル名(またはパス)がファイル形式が有効なファイル形式かどうか

$filetype = wp_check_filetype($file);
if($filetype[‘ext’] === ‘jpg’){
//変数「$file」の拡張子が、「jpg」の場合
}
if($filetype[‘type’] === ‘image/jpeg’){
//変数「$file」のMIMEタイプが、「image/jpeg」の場合
}

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Category

Archive