- 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細)
条件分岐タグ
このページ「条件分岐タグ」は一部未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています。
目次
- 1 はじめに
- 2 条件の判定
- 2.1 メインページ
- 2.2 フロントページ
- 2.3 管理パネル
- 2.4 個別投稿ページ
- 2.5 先頭固定表示の投稿
- 2.6 投稿タイプ
- 2.7 階層を持つ投稿タイプ
- 2.8 投稿タイプアーカイブ
- 2.9 コメントポップアップ
- 2.10 投稿を含むページ
- 2.11 WordPress ページ
- 2.12 カテゴリーページ
- 2.13 タグページ
- 2.14 タクソノミーページ
- 2.15 登録タクソノミー
- 2.16 作成者ページ
- 2.17 作成者ページ
- 2.18 日付別ページ
- 2.19 アーカイブページ
- 2.20 検索結果ページ
- 2.21 404 Not Found ページ
- 2.22 複数にわたるページ
- 2.23 添付ファイルページ
- 2.24 シングルページ (固定ページ、個別投稿ページ、添付ファイルページ)
- 2.25 フィード
- 2.26 トラックバック
- 2.27 プレビュー
- 2.28 抜粋あり
- 2.29 その他の使い方
- 2.30 ナビゲーションメニュー割り当てあり
- 2.31 ループ内
- 2.32 サイドバー使用中
- 2.33 ネットワークの一部(マルチサイト)
- 2.34 ネットワークの管理者(マルチサイト)
- 2.35 有効化済みプラグイン
- 2.36 機能対応のテーマ
- 3 動作サンプル
- 4 条件分岐タグ インデックス
- 5 変更履歴
- 6 関数リファレンス
はじめに
条件分岐タグ (Conditional Tag) は、テンプレートファイル内で表示される内容や、特定のページ内容を表示する条件を設定するのに使います。例えば、ブログのホームページの上部に短い文を表示させたいとしましょう。is_home()を使えば、簡単に実行できます。
これらのタグはテンプレート階層と深い関わりがあります。
注: 条件分岐タグが使えるのは WordPress の init アクションフックの後のみです。テーマの function.php 本文内(関数の外)では正しく動作しません。
条件の判定
条件分岐タグは、現在のページが指定した条件に合致するかどうかをチェックし、TRUE もしくは FALSE を返します。以下の条件分岐タグの説明では、TRUE 値が返される場合の説明をしています。また、タグで引数が使える場合は追記してあります。
メインページ
- is_home()
- メインブログページが表示されている場合。
- This is the page which is showing the time based blog content of your site, so if you've set a static Page for the Front Page (see below), then this will only be true on the Page which you set as the "Posts page" in Administration > Settings > Reading.
フロントページ
- is_front_page()
- サイトのフロントページが表示されている場合(投稿・固定ページにかかわらず)。
- true を返すのは、表示設定の「トップページの表示」として
- 「最新の投稿」を設定している場合には、メインブログページが表示されるとき
- 「固定ページ (以下を選択)」を設定している場合には、「フロントページ」として選択した固定ページが表示されるとき
管理パネル
- is_admin()
- ダッシュボードまたは管理パネルが表示されている場合。
個別投稿ページ
- is_single()
- 個別投稿のページ(または添付ファイルページ・カスタム投稿タイプの個別ページ)が表示されている場合。固定ページには適用されない。
- is_single( '17' )
- ID 17の投稿が表示されている場合。
- is_single( 'Irish Stew' )
- "Irish Stew" というタイトルの投稿が表示されている場合。
- is_single( 'beef-stew' )
- "beef-stew" という投稿スラッグの投稿が表示されている場合。
- is_single( array( 17, 'beef-stew', 'Irish Stew' ) )
- ID が 17、投稿スラッグが "beef-stew"、またはタイトルが "Irish Stew" のいずれかにあてはまる投稿が表示されている場合。
- is_single( array( 17, 19, 1, 11 ) )
- Returns true when the single post being displayed is either post ID 17, post ID 19, post ID 1, or post ID 11.
- is_single( array( 'beef-stew', 'pea-soup', 'chili' ) )
- Returns true when the single post being displayed is either the post_name "beef-stew", post_name "pea-soup" or post_name "chili".
- is_single( array( 'Beef Stew', 'Pea Soup', 'Chili' ) )
- Returns true when the single post being displayed is either the post_title "Beef Stew", post_title "Pea Soup" or post_title "Chili".
注: この関数は投稿 ID、投稿タイトル、または投稿名を区別しません。投稿 ID が「17」の投稿をリクエストした場合、タイトルや投稿スラッグが「17」の投稿が表示されることがあります。
先頭固定表示の投稿
- is_sticky()
- 投稿編集ページで「この投稿を先頭に固定表示」のチェックボックスがついている投稿が表示されている場合。もし ID 変数が指定されていない場合、投稿 ID は WordPress ループの投稿のものになる。
- is_sticky( '17' )
- ID 17 の投稿が先頭固定表示の場合、真を返す。
投稿タイプ
- get_post_type()
- Not really a conditional tag, but returns the registered post type of the current post.
- if( 'book' == get_post_type() ) ...
- Tests to see if the current post is of type 'book'.
- post_type_exists()
- Returns true if a given post type is a registered post type. This does not test if a post is a certain post_type. Note: This function replaces a function called is_post_type which existed briefly in 3.0 development.
階層を持つ投稿タイプ
- is_post_type_hierarchical($post_type)
- Returns true if this $post_type has been set with hierarchical support when registered.
- is_post_type_hierarchical( 'book' )
- Returns true if the book post type was registered as having support for hierarchical.
投稿タイプアーカイブ
- is_post_type_archive() : Returns true on any post type archive.
- is_post_type_archive( $post_type ) : Returns true if on a post type archive page that matches $post_type (can be a single post type or an array of post types).
To turn on post type archives, use 'has_archive' => true, when registering the post type.
コメントポップアップ
- is_comments_popup()
- コメントポップアップウィンドウが表示されている場合。
投稿を含むページ
- comments_open()
- WordPress ループ内で処理中の投稿がコメント受信を受け付けている場合。
- pings_open()
- WordPress ループ内で処理中の投稿がピン(ピンバックおよびトラックバック)を受け付けている場合。
WordPress ページ
ここでいう「ページ」とは、WordPressにおける固定ページのことで、いわゆる「Web ページ」とは異なります。つまり、post_type が 'page' となっているもののことです。詳しくは、「用語について」をご覧ください。
- is_page()
- 固定ページが表示されている場合。
- is_page( '42' )
- ID 42の固定ページが表示されている場合。
- is_page( 'About Me And Joe' )
- "About Me And Joe"というタイトルの固定ページが表示されている場合。
- is_page( 'about-me' )
- "about-me"という投稿スラッグの固定ページが表示されている場合。
- is_page( array( 42, 'about-me', 'About Me And Joe' ) )
- ID が 42、投稿スラッグが "about-me"、またはタイトルが "About Me And Joe" のいずれかにあてはまる固定ページが表示されている場合。
- is_page( array( 42, 54, 6 ) )
- ID が 42、54、または6のいずれかの固定ページが表示されている場合。
複数にわたるページの一部かどうかをチェックする
You can use this code to check whether you're on the nth page in a Post or PAGE Page that has been divided into pages using the <!--nextpage--> QuickTag. This can be useful, for example, if you wish to display meta-data only on the first page of a post divided into several pages.
例 1
<?php $paged = $wp_query->get( 'paged' ); if ( ! $paged || $paged < 2 ) { // 複数にわたるページの一部ではない場合 (または複数にわたる投稿・固定ページの最初のページの場合) } else { // 複数にわたるページの一部である場合 } ?>
例 2
<?php $paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : false; if ( $paged === false ) { // 複数ページの一部ではない場合 (または投稿・固定ページの複数ページの最初のページの場合) } else { // 複数ページの一部である場合 } ?>
サブページかどうかをチェックする
残念ながら、is_subpage()というタグは今のところありませんが、対応策はあります。
スニペット 1
<?php global $post; // ループ外の場合 if ( is_page() && $post->post_parent ) { // サブページの場合 } else { // サブページではない場合 } ?>
以下のように is_subpage() 関数を作ることもできます。functions.php ファイルにこの関数を追加すればスニペット 1 のようにサブページかどうかをチェックすることができます。この関数は現在のページがサブページなら親ページの ID を、サブページでないなら false を返します。
スニペット 2
function is_subpage() { global $post; // $post には現在の固定ページの情報があります if ( is_page() && $post->post_parent ) { // 現在の固定ページが親ページを持つかどうかをチェックします return $post->post_parent; // 親ページの ID を返します } else { // 親ページを持たないので... return false; // ...false を返します }; };
サブページかどうかのチェックを頻繁にする予定なら、スニペット 1 よりも スニペット 2 のように関数にして利用する方が便利です。
現在のページの親ページが特定の固定ページ、例えば "紹介"(デフォルトでページ ID は 2)かどうかをチェックするならスニペット 3 のようにチェックできます。この方法は、指定したページであるか、またはそのサブページであるかをチェックします。サイトのセクションごとに異なった変数(バナーや見出しなど)を設定するのに便利です。
スニペット 3
<?php if ( is_page( 'about' ) || '2' == $post->post_parent ) { // このページは "紹介"、または親ページが "紹介" $bannerimg = 'about.jpg'; } elseif ( is_page( 'learning' ) || '56' == $post->post_parent ) { $bannerimg = 'teaching.jpg'; } elseif ( is_page( 'admissions' ) || '15' == $post->post_parent ) { $bannerimg = 'admissions.jpg'; } else { $bannerimg = 'home.jpg'; // 上のどれにも当てはまらないページ(たぶんホームページ) } ?>
スニペット 4 はスニペット 3 のチェックをより簡単に実現する関数です。この関数は指定したページ('紹介' など)またはそのサブページ(親ページの ID が 2)であれば true を返します。
スニペット 4
function is_tree( $pid ) { // $pid = 指定したページの ID global $post; // $post に現在の固定ページの情報をロード if ( is_page($pid) ) return true; // その固定ページまたはサブページの場合 $anc = get_post_ancestors( $post->ID ); foreach ( $anc as $ancestor ) { if( is_page() && $ancestor == $pid ) { return true; } } return false; // その固定ページではない、または親ページではない場合 }
スニペット 4 を functions.php ファイルに追加して、is_tree( 'id' ) を実行すると現在のページが指定したページ、またはそのサブページであるかどうかがわかります。例えば、スニペット 3 の始めの if ブロック内にある "is_page( 'about' ) || '2' == $post->post_parent" は is_tree( '2' ) に置き換えられます。
注意:2階層以上のページ階層がある場合は、親ページは現在より1階層上のページを差します。ページ階層の最上にあるページではないことに注意してください。
ページテンプレート
この条件分岐タグを使うと、特定のページテンプレートを使っているかどうかをチェックできます。
- is_page_template()
- ページテンプレートが使われている場合。
- is_page_template('about.php')
- "about" というページテンプレートが使われている場合。他の条件分岐タグとは違い、特定のテンプレートを選びたい場合には about.php などのファイル名を指定する必要があります。
カテゴリーページ
- is_category()
- あるカテゴリーのアーカイブページが表示されている場合。
- is_category( '9' )
- カテゴリーID 9のアーカイブページが表示されている場合。
- is_category( 'Stinky Cheeses' )
- "Stinky Cheeses"というカテゴリーのアーカイブページが表示されている場合。
- is_category( 'blue-cheese' )
- "blue-cheese"というカテゴリースラッグのアーカイブページが表示されている場合。
- is_category( array( 9, 'blue-cheese', 'Stinky Cheeses' ) )
- 投稿のカテゴリーが term_ID 9、スラッグが "blue-cheese" の場合、カテゴリー名が "Stinky Cheeses" のいずれかにあてはまる場合、真を返す。
- in_category( '5' )
- (注: in_category です。) 現在の投稿がカテゴリーID 5に属する場合にtrueを返します。 詳細
- in_category( array( 1,2,3 ) )
- Returns true if the current post is in either category 1, 2, or 3.
- ! in_category( array( 4,5,6 ) )
- Returns true if the current post is NOT in either category 4, 5, or 6. Note the ! at the beginning.
is_archive() とカテゴリーテンプレートも参照してください。
タグページ
- is_tag()
- タグのアーカイブページが表示されている場合。
- is_tag( 'mild' )
- 'mild' というスラッグのついたタグのアーカイブページが表示されている場合。
- is_tag( array( 'sharp', 'mild', 'extreme' ) )
- 'sharp' または 'mild' または 'extreme' というスラッグのついたタグのアーカイブページが表示されている場合。
- has_tag()
- タグのある投稿がループ内で表示されている場合。
- has_tag( 'mild' )
- 'mild' というタグのある投稿が表示されている場合。
- has_tag( array( 'sharp', 'mild', 'extreme' ) )
- 配列内のいずれかのタグのある投稿が表示されている場合。
is_archive() と タグテンプレート/en もあわせてお読みください。
タクソノミーページ
- is_tax()
- タクソノミーのアーカイブページが表示されている場合。
- is_tax( 'flavor' )
- 'flavor' というスラッグのついたタクソノミーのアーカイブページが表示されている場合。
- is_tax( 'flavor', array( 'sharp', 'mild', 'extreme' ) )
- 'sharp' または 'mild' または 'extreme' というスラッグのついた flavor タクソノミーのアーカイブページが表示されている場合。
is_archive() もあわせてお読みください。
登録タクソノミー
- taxonomy_exists()
- あるタクソノミーが register_taxonomy() を使って登録されている場合。バージョン 3.0 で非推奨になるまでは is_taxonomy() と呼ばれていた。
作成者ページ
- is_author()
- 作成者のアーカイブページが表示されている場合。
- is_author( '4' )
- ID 4 の作成者のアーカイブページを表示している場合。
- is_author( 'Vivian' )
- ニックネームが"Vivian"のアーカイブページを表示している場合。
- is_author( 'john-jones' )
- "john-jones" という「ナイスネーム」を持つ作成者のアーカイブページを表示している場合。
- is_author( array( 4, 'john-jones' , 'Vivian' ) )
- ID が4、ナイスネームが "john-jones"、またはニックネームが "Vivian" という作成者のアーカイブページを表示している場合。
is_archive() や作成者テンプレート/en もあわせてお読みください。
- is_multi_author()
- サイト上に一人以上投稿を公開しているユーザーがいる場合。バージョン 3.2 から導入された。
is_archive() や作成者テンプレート/en もあわせてお読みください。
日付別ページ
- is_date()
- 日付別のアーカイブページのいずれかが表示されている場合。(例:月別、年別、日別、時間別)
- is_year()
- 年別のアーカイブページが表示されている場合。
- is_month()
- 月別のアーカイブページが表示されている場合。
- is_day()
- 日別のアーカイブページが表示されている場合。
- is_time()
- 毎時別、毎分別、毎秒別のアーカイブページが表示されている場合。
- is_new_day()
- 投稿の日付が新しい日の場合。ループ内で使う。
is_archive() もあわせてお読みください。
アーカイブページ
- is_archive()
- 各アーカイブページが表示されている場合。アーカイブページには、カテゴリー、タグ、作成者、日付別のものがあります。
検索結果ページ
- is_search()
- 検索結果のページが表示されている場合。
404 Not Found ページ
- is_404()
- "HTTP 404: Not Found"エラーページが表示されている場合。
複数にわたるページ
- is_paged()
- 表示中のページが複数のページにわたる場合。これは例えばアーカイブページやメインページに表示する投稿数よりも多い投稿があり、複数ページに分かれているときを指し、2ページ目以降のときに true を返します。ただし、1つの投稿や固定ページの本文が <!--nextpage--> クイックタグで複数ページに分けられている場合は当てはまりません。投稿または固定ページが <!--nextpage--> クイックタグを使って分割されているかどうか調べるには、複数にわたるページの一部かどうかをチェックするをご覧ください。
添付ファイルページ
- is_attachment()
- 投稿または固定ページの添付ファイルが表示されている場合。添付ファイルは、投稿画面のメディアアップロード機能を使ってアップロードした画像などのファイルの事で、テンプレートを使って独自のページ内に表示できます。詳細は、 画像や添付ファイルの使い方/en をご覧ください。
シングルページ (固定ページ、個別投稿ページ、添付ファイルページ)
- is_singular()
- is_single()、is_page() 、is_attachment() のいずれかが真である場合。
- is_singular( 'book' )
- 'book' というカスタム投稿タイプの投稿を表示している場合。
- is_singular( array( 'newspaper', 'book' ) )
- 'newspaper' または 'book' というカスタム投稿タイプの投稿を表示している場合。
フィード
- is_feed()
- Syndication(フィード)がリクエストされた場合。
- このタグは通常、一般のユーザーがページを表示しているときに条件を判断するためではなく、プラグイン開発の際に WordPress 内部で使われます。
トラックバック
- is_trackback()
- フックの中にトラックバックの機構が組み込まれている場合。
- このタグは通常、一般のユーザーがページを表示しているときに条件を判断するためではなく、プラグイン開発の際に WordPress 内部で使われます。
プレビュー
- is_preview()
- 未公開モードで固定リンクページを表示している場合。
抜粋あり
- has_excerpt()
- 投稿に (手動で書かれた) 抜粋がある場合。
- has_excerpt( '42' )
- 投稿 ID 42 の投稿に抜粋がある場合。
<?php // もし関数内なら $post を取得 global $post; if ( empty( $post->post_excerpt ) ) { // 投稿に抜粋がない場合 } else { // 投稿に抜粋がある場合 } ?>
その他の使い方
when you need hide the excerpt auto displayed and only display yours posts excerpts.
<?php if ( ! has_excerpt() ) { echo ''; } else { the_excerpt(); }
Replace auto excerpt for a text or code.
<?php if ( ! has_excerpt() ) {?> <!-- you text or code --> <?php } ?>
- has_nav_menu()
- 登録済みのナビゲーションメニュー一が割り当てられているかどうかをチェックする。割り当て済み (true) または割り当てなし (false) を返す。
ループ内
- in_the_loop()
- ループ内かどうかをチェックする。ループ内にあった場合真を返すので、プラグイン作者に便利。
サイドバー使用中
- is_active_sidebar()
- 指定したダイナミックサイドバーが使用中の場合、真を返す。サイドバー名、ID、番号を指定できる。
ネットワークの一部(マルチサイト)
- is_multisite is_multisite()
- 現在のサイトがマルチサイトインストールの一部かどうかチェックする。
ネットワークの管理者(マルチサイト)
- is_super_admin()
- ユーザーがネットワークの特権管理者かどうかをチェックする。
有効化済みプラグイン
- is_plugin_active()
- プラグインが有効化されているかチェックする。
機能対応のテーマ
- current_theme_supports()
- テーマに機能が存在するかチェックする。
動作サンプル
以下は条件分岐タグの動作サンプルです。
個別投稿
以下はis_single()によって特定の情報を個別投稿のページでのみ表示させるための例文です。
if ( is_single() ) { echo 'この投稿は' . single_cat_title() . 'カテゴリーに属しています'; }
以下の例は、現在表示しているページによって本文を表示するか抜粋を表示するかを切り替えます。
if ( is_home() || is_single() ) { the_content(); } else { the_excerpt(); }
日付別の表示
以下の例は、日付別ページへのアクセスが行われたときに、年別に色分けして表示させます。
<?php // WordPress ループを開始 if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <h2 id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"> <?php the_title(); ?></a></h2> <small><?php the_time('Y/n/j') ?> <!-- by <?php the_author() ?> --></small> <?php // 日付別アーカイブページかどうかをチェック if ( is_date() ) { if ( date( 'Y' ) != get_the_date( 'Y' ) ) { // 今年の投稿ではない場合、"oldentry" クラスを追加してスタイルを変える echo '<div class="oldentry">'; } else { echo '<div class="entry">'; } } else { echo '<div class="entry">'; } the_content( '続きを読む »' ); ?> </div>
サイドバーの内容をページによって変更する
以下の例では、閲覧中のページによってサイドバーに表示させる内容を変更します。
(注)下記コード内の wp_list_cats は廃止予定です。替わりにwp_list_categories をお使いください。(コードを直してくれる人募集中!)
<!-- サイドバー開始 --> <div id="sidebar"> <?php // 表示中のページに合わせたサイドバーコンテンツを生成 if ( is_home() ) { // ホームページを表示している際、トップレベルカテゴリーの一覧を表示 echo "<ul>"; wp_list_cats('optionall=0&sort_column=name&list=1&children=0'); echo "</ul>"; } elseif ( is_category() ) { // カテゴリーアーカイブページを表示している際、そのカテゴリー内のサブカテゴリーを含む一覧を表示 echo "<ul>"; wp_list_cats('optionall=1&sort_column=name&list=1&children=1&hierarchical=1'); echo "</ul>"; elseif ( is_single() ) { // 投稿の固定リンクページを表示している際は何も表示させない } elseif ( is_page() ) { // 固定ページを表示しています。どのページ? if ( is_page( '管理人について' ) ) { // 「管理人について」ページ echo "<p>当ブログの管理人についての説明ページ。</p>"; } elseif ( is_page( 'ブログについて' ) ) { echo "<p>当ブログについての説明ページ。</p>"; } else { // その他の固定ページで表示させたいものがあればここに記入 } } else { // その他のページ(アーカイブページ、検索、404など)で表示させたいものがあればここに記入 } // 以上で終わりです! ?> <form id="searchform" method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <div> <input type="text" name="s" id="s" size="15" /> <input type="submit" value="<?php _e( 'Search' ); ?>" /> </div> </form> </div> <!-- end sidebar -->
分かりやすい 404 ページ
Creating an Error 404 Page という投稿の サーバーが 404 ページを見つけるのを助ける というセクションに、PHP の条件分岐関数 isset()
を使う例が書かれています。
ダイナミックメニューハイライト
ダイナミックハイライトとは、条件分岐タグを使用して、メニュー内の現在アクセスしているページを際立たせる方法です。
sidebar.php などの他のテンプレートファイルによってクエリが実行された場合、元の条件分岐タグは破損してしまいます。例えば、header.php では条件分岐タグが適切に機能するのに、footer.php では正しく機能しないトラブルがよくあります。これを解決するにはフッターで条件分岐タグを使う前に wp_reset_query を実行します:
<?php wp_reset_query(); if ( is_page( '2' ) ) { echo 'ページ 2 です。'; } ?>
このようなトラブルを無くすために、別の場所(テンプレートファイルやプラグイン)でクエリを実行した場合は、必要な処理を終えた後に必ず wp_reset_query を実行するようにしましょう。
<?php query_posts('posts_per_page=5&cat=123'); if( have_posts() ) : while( have_posts() ) : the_posts(); /* 投稿を出力するなどの処理... */ endwhile; else : /* 該当する投稿がない場合、何もしない */ endif; wp_reset_query(); ?>