WordPressでダイナミックなウェブサイトを構築する上で欠かせないのが、「条件分岐タグ」です。これらはPHPの関数として提供され、現在表示しているページがどのような種類のページなのか(例: フロントページ、個別投稿ページ、アーカイブページなど)、あるいはどのような状態なのか(例: ユーザーがログインしているか、特定のカテゴリーが表示されているかなど)を判定するために使用します。この判定結果に基づいて、表示するコンテンツ、適用するレイアウトやスタイルを柔軟に切り替えることができます。
条件分岐タグを使いこなすことは、WordPressテーマ開発やサイトカスタマイズの自由度を格段に向上させ、ユーザーにとってより最適な情報提供を実現するための基礎となります。この記事では、主要な条件分岐タグを網羅的に紹介し、その使い方をチートシート形式で解説します。
条件分岐タグの基本的な使い方
条件分岐タグは、主にPHPのif
文と組み合わせて使用します。これらの関数は、条件に合致する場合はtrue
を、合致しない場合はfalse
を返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php // 例: フロントページの場合に特定のメッセージを表示 if ( is_front_page() ) { echo '<p>ようこそ!当サイトのフロントページです。</p>'; } elseif ( is_category('news') ) { // 「news」カテゴリーのアーカイブページの場合 echo '<p>最新のニュースをお届けします。</p>'; } else { // 上記以外のページの場合の処理 echo '<p>通常のコンテンツページです。</p>'; } // 複数の条件を組み合わせることも可能 if ( is_single() && comments_open() ) { // 個別投稿ページで、かつコメントが許可されている場合にコメントフォームを表示 comments_template(); } ?> |
多くの条件分岐タグは、引数を指定することでより詳細な判定が可能です(例: 特定の投稿IDの個別投稿ページか、特定のスラッグの固定ページかなど)。
主要な条件分岐タグ一覧
WordPressテンプレート内で現在のページ状態を判定するために使用できる主要な条件分岐タグを機能別に分類しました。各タグの説明の冒頭には、その利用頻度や重要度を星の5段階評価で示しています。星の数の目安は以下の通りです。
★★★★★:ほぼ全ての開発で頻繁に利用され、基本かつ非常に重要なパラメータ
★★★★☆:高頻度で利用され、多くの一般的なカスタマイズで役立つ重要なパラメータ
★★★☆☆:中程度の頻度で利用され、特定の機能を実現する際に便利なパラメータ
★★☆☆☆:利用頻度はやや低めですが、特定の要件や細かな制御を行いたい場合に役立つパラメータ
★☆☆☆☆:利用頻度は低く、非常に限定的な状況や高度なカスタマイズでのみ使用されるパラメータ
関数名 | 判定する条件・説明 (重要度/利用頻度) | 主な引数 (オプション) | 備考・よくある混同 | |
---|---|---|---|---|
ホームページ・フロントページ関連 | ||||
is_front_page() |
★★★★★ サイトのフロントページ(サイトのルートURLで表示されるページ)かどうかを判定します。「設定 > 表示設定」の「ホームページの表示」設定に依存します。 |
なし | is_home() との違いに注意。サイトの「顔」となるページを判定。 |
|
is_home() |
★★★★★ ブログ投稿一覧ページ(メインのブログインデックス)かどうかを判定します。「設定 > 表示設定」でホームページに「最新の投稿」を指定した場合はフロントページと一致。固定ページをホームページにし、「投稿ページ」を別途指定した場合はその「投稿ページ」でtrueになります。 |
なし | is_front_page() との違いを理解することが重要。 |
|
単一投稿・固定ページ・添付ファイル関連 | ||||
is_singular( $post_types = '' ) |
★★★★★ 何らかの単一記事ページ(個別投稿、固定ページ、カスタム投稿タイプの単一記事)かどうかを判定します。 |
string|array $post_types (判定対象の投稿タイプスラッグ) |
is_single() やis_page() より広範な単一記事の判定。 |
|
is_single( $post = '' ) |
★★★★★ 通常の「投稿(post)」タイプの個別投稿ページかどうか、または特定の投稿ID/スラッグ/タイトルの個別投稿ページかどうかを判定します。引数で投稿タイプを指定することも可能。 |
int|string|array $post (投稿ID, スラッグ, タイトル, またはそれらの配列), string|array $post_type (対象投稿タイプ、WP4.4以降) |
is_singular() との違い、カスタム投稿タイプの場合は引数に投稿タイプ指定が必要な場合も。 |
|
is_page( $page = '' ) |
★★★★★ 固定ページかどうか、または特定の固定ページID/スラッグ/タイトルの固定ページかどうかを判定します。 |
int|string|array $page (固定ページID, スラッグ, タイトル, またはそれらの配列) |
「ページテンプレート」を指定して判定することも可能 (例: is_page_template( )。 |
|
is_attachment() |
★★★☆☆ 添付ファイル(画像、動画、PDFなど)の単独ページかどうかを判定します。 |
なし | 通常、専用のテンプレート ( attachment.php 等)が用意されます。 |
|
アーカイブページ関連 | ||||
is_archive() |
★★★★★ 何らかのアーカイブページ(カテゴリー、タグ、日付、著者、カスタム投稿タイプ、カスタムタクソノミーなど)かどうかを判定します。 |
なし | 非常に広範なアーカイブ判定。より具体的な判定は後述のタグで。 | |
is_category( $category = '' ) |
★★★★☆ カテゴリーアーカイブページかどうか、または特定のカテゴリーID/スラッグ/名前のアーカイブページかどうかを判定します。 |
int|string|array $category (カテゴリーID, スラッグ, 名前, またはそれらの配列) |
||
is_tag( $tag = '' ) |
★★★★☆ タグアーカイブページかどうか、または特定のタグID/スラッグ/名前のアーカイブページかどうかを判定します。 |
int|string|array $tag (タグID, スラッグ, 名前, またはそれらの配列) |
||
is_tax( $taxonomy = '', $term = '' ) |
★★★★☆ カスタムタクソノミーのアーカイブページかどうか、または特定のタクソノミーやタームのアーカイブページかどうかを判定します。 |
string|array $taxonomy (タクソノミースラッグ), int|string|array $term (タームID, スラッグ, 名前) |
汎用的なタクソノミーアーカイブ判定。 | |
is_author( $author = '' ) |
★★★☆☆ 著者アーカイブページかどうか、または特定の著者ID/ニックネームのアーカイブページかどうかを判定します。 |
int|string|array $author (著者ID, ニックネーム, またはそれらの配列) |
||
is_date() |
★★★☆☆ 日付ベースのアーカイブページ(年別、月別、日別)かどうかを判定します。 |
なし | より詳細はis_year() , is_month() , is_day() で。 |
|
is_year() / is_month() /is_day() |
★★☆☆☆ それぞれ年別/月別/日別アーカイブページかどうかを判定します。 |
なし | is_date() と併用または単独で使用。 |
|
is_post_type_archive( $post_types = '' ) |
★★★★☆ カスタム投稿タイプのアーカイブページかどうか、または特定の投稿タイプのアーカイブページかどうかを判定します。 |
string|array $post_types (判定対象の投稿タイプスラッグ) |
カスタム投稿タイプ利用時に必須。 | |
その他ページ・状態関連 | ||||
is_search() |
★★★★☆ 検索結果ページかどうかを判定します。 |
なし | ||
is_404() |
★★★★☆ 404 Not Foundエラーページかどうかを判定します。 |
なし | ||
is_paged() |
★★★☆☆ アーカイブページやブログ投稿一覧ページなどで、2ページ目以降が表示されているかどうかを判定します。 |
なし | ページネーションの制御や表示の出し分けに。 | |
is_admin() |
★★★★★ 現在のページが管理画面(ダッシュボード)かどうかを判定します。フロントエンドでは通常 false 。 |
なし | 管理画面用の処理とフロントエンド用の処理を分ける際に。 | |
is_user_logged_in() |
★★★★☆ 現在の訪問者がログインしているかどうかを判定します。 |
なし | 会員向けコンテンツの表示制御などに。 | |
投稿・ページ内容関連の便利な条件 | ||||
has_post_thumbnail( $post_id = null ) |
★★★★☆ 現在の投稿(または指定した投稿ID)にアイキャッチ画像が設定されているかどうかを判定します。 |
int $post_id (投稿ID) |
アイキャッチ画像の有無で表示を切り替える際に。 | |
comments_open( $post_id = null ) |
★★★☆☆ 現在の投稿(または指定した投稿ID)でコメントが許可されている(受付中)かどうかを判定します。 |
int $post_id |
コメントフォームの表示制御などに。 | |
pings_open( $post_id = null ) |
★★☆☆☆ 現在の投稿(または指定した投稿ID)でピンバックやトラックバックが許可されているかどうかを判定します。 |
int $post_id |
||
is_sticky( $post_id = null ) |
★★★☆☆ 現在の投稿(または指定した投稿ID)が「先頭に固定表示」されている投稿かどうかを判定します。 |
int $post_id |
固定投稿に特別なスタイルを適用する場合などに。 | |
has_excerpt( $post_id = null ) |
★★★☆☆ 現在の投稿(または指定した投稿ID)に手動で設定された抜粋があるかどうかを判定します。 |
int $post_id |
手動抜粋と自動生成抜粋で表示を分けたい場合などに。 | |
has_tag( $tag = '', $post = null ) |
★★★☆☆ 現在の投稿(または指定した投稿)が特定のタグ(または任意のタグ)を持つかどうかを判定します。 |
string|array $tag (タグID, スラッグ, 名前), int|WP_Post $post |
同様にhas_category() , has_term() (カスタムタクソノミー用) もあります。 |
サンプルコード集 (実践的な組み合わせ例)
1. ヘッダーのタイトル表示をページタイプによって変更
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php // header.php 内などで if ( is_front_page() && is_home() ) { // 最新の投稿がホームページの場合 echo '<h1>' . get_bloginfo('name') . '</h1><p>' . get_bloginfo('description') . '</p>'; } elseif ( is_front_page() ) { // 固定ページがホームページの場合 echo '<h1>' . get_the_title() . '</h1>'; // 固定ページのタイトル } elseif ( is_home() ) { // ブログ投稿インデックスページの場合 echo '<h1>' . single_post_title('', false) . '</h1>'; // 「投稿ページ」として設定された固定ページのタイトル } elseif ( is_archive() ) { echo '<h1>'; the_archive_title(); // アーカイブタイトル (例: カテゴリー: ニュース) echo '</h1>'; the_archive_description( '<div class="taxonomy-description">', '</div>' ); } elseif ( is_search() ) { echo '<h1>検索結果: ' . esc_html( get_search_query() ) . '</h1>'; } elseif ( is_404() ) { echo '<h1>ページが見つかりません (404 Not Found)</h1>'; } elseif ( is_singular() ) { // 個別投稿、固定ページ、カスタム投稿タイプの単一ページ echo '<h1>' . get_the_title() . '</h1>'; } else { echo '<h1>' . get_bloginfo('name') . '</h1>'; // その他の場合 } ?> |
2. 特定のカテゴリーの個別投稿ページでのみ特別なサイドバーを表示
1 2 3 4 5 6 7 8 |
<?php // sidebar.php またはテンプレートファイル内 if ( is_single() && in_category('special-feature') ) { // 'special-feature' カテゴリーの個別投稿 dynamic_sidebar('special-sidebar'); // 'special-sidebar' という名前のウィジェットエリアを表示 } elseif ( is_active_sidebar('primary-sidebar') ) { dynamic_sidebar('primary-sidebar'); // 通常のサイドバー } ?> |
3. ログインユーザーと非ログインユーザーで表示するメッセージを切り替え
1 2 3 4 5 6 7 8 |
<?php if ( is_user_logged_in() ) { $current_user = wp_get_current_user(); echo '<p>ようこそ、' . esc_html( $current_user->display_name ) . 'さん! <a href="' . wp_logout_url( home_url() ) . '">ログアウト</a></p>'; } else { echo '<p>コンテンツの全文を読むには<a href="' . wp_login_url( get_permalink() ) . '">ログイン</a>してください。</p>'; } ?> |
よくある質問 (FAQ)
- Q1:
is_home()
とis_front_page()
の違いがよく分かりません。 - A1:
これはWordPress初学者が最も混乱しやすいポイントの一つです。
is_front_page()
: サイトのフロントページ(トップページ、ドメインルートで表示されるページ)であればtrue
を返します。WordPressの「設定 > 表示設定」で「ホームページの表示」が「最新の投稿」でも「固定ページ」でも、その設定されたトップページであればtrue
です。is_home()
: ブログ投稿の一覧が表示されるページであればtrue
を返します。- 「表示設定」でホームページが「最新の投稿」の場合: フロントページで
is_home()
もis_front_page()
もtrue
になります。 - 「表示設定」でホームページが「固定ページ」、かつ「投稿ページ」として別の固定ページが指定されている場合: フロントページでは
is_front_page()
がtrue
でis_home()
はfalse
。指定された「投稿ページ」ではis_home()
がtrue
でis_front_page()
はfalse
になります。
- 「表示設定」でホームページが「最新の投稿」の場合: フロントページで
サイトのトップページに特定のコンテンツを表示し、ブログ一覧は別のページに設けたい場合は、この違いを理解することが不可欠です。
- Q2:
is_single()
,is_page()
,is_singular()
の違いは? - A2:
is_single()
: 基本的には通常の「投稿 (post)」タイプの個別記事ページを判定します。引数に投稿ID、スラッグ、タイトル、または投稿タイプを指定することで、より詳細な判定も可能です。is_page()
: 「固定ページ (page)」タイプのページを判定します。引数に固定ページID、スラッグ、タイトル、またはページテンプレート名を指定できます。is_singular()
:is_single()
,is_page()
,is_attachment()
のいずれか、またはカスタム投稿タイプの個別記事ページであればtrue
を返します。つまり、「単一の投稿アイテム」を表示しているかどうかを広く判定します。引数で特定の投稿タイプに絞ることも可能です。
特定の投稿タイプのみを対象としたい場合は
is_singular('your_post_type')
のように使います。 - Q3: 条件分岐タグの引数にIDやスラッグを指定する際の注意点は?
- A3: 多くの条件分岐タグでは、引数にID(整数)、スラッグ(文字列)、タイトル(文字列)を渡すことができます。また、これらの値を配列で複数指定することも可能です(例:
is_category( array(5, 'news') )
はIDが5のカテゴリーまたはスラッグが’news’のカテゴリーであればtrue)。引数を指定しない場合は、現在のページがその一般的なタイプ(例:is_category()
なら何らかのカテゴリーアーカイブ)であるかを判定します。
まとめ
WordPressの条件分岐タグは、テーマの表示ロジックを制御するための強力なツールセットです。これらのタグを適切に組み合わせることで、あらゆるページや状況に応じて最適なコンテンツとデザインを提供することが可能になります。最初はどのタグを使えばよいか迷うかもしれませんが、この記事のチートシートを参考に、実際に試しながら慣れていくことが大切です。条件分岐をマスターして、よりダイナミックでユーザーフレンドリーなWordPressサイトを構築しましょう。
私たちは、埼玉県川越市とその周辺エリアを拠点として、WordPressサイトの構築・カスタマイズから、日々の運用サポート、専門的なトラブルシューティングまで、幅広くお手伝いさせていただいております。もちろん、遠方のお客様からのご依頼もオンラインで柔軟に対応可能ですので、お気軽にご相談ください。
もっとWordPressの技術を磨きたい、あるいは信頼できる技術パートナーをお探しでしたら、WordPress顧問エンジニアサービスをご検討くださいね。