- 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細)
条件分岐タグ
このページ「条件分岐タグ」は一部未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています。
目次
- 1 はじめに
- 2 条件の判定
- 2.1 メインページ
- 2.2 フロントページ
- 2.3 管理パネル
- 2.4 個別投稿ページ
- 2.5 先頭固定表示の投稿
- 2.6 投稿タイプ
- 2.7 階層を持つ投稿タイプ
- 2.8 コメントポップアップ
- 2.9 記事を含むページ
- 2.10 WordPress ページ
- 2.11 カテゴリーページ
- 2.12 タグページ
- 2.13 タクソノミーページ
- 2.14 A Registered Taxonomy
- 2.15 作成者ページ
- 2.16 日付別ページ
- 2.17 アーカイブページ
- 2.18 検索結果ページ
- 2.19 404 Not Found ページ
- 2.20 複数にわたるページ
- 2.21 添付ファイルページ
- 2.22 シングルページ (固定ページ、個別投稿ページ、添付ファイルページ)
- 2.23 フィード
- 2.24 トラックバック
- 2.25 プレビュー
- 2.26 抜粋あり
- 2.27 その他の使い方
- 2.28 ループ内
- 2.29 サイドバー使用中
- 3 動作サンプル
- 4 条件分岐タグ インデックス
- 5 変更履歴
- 6 関数リファレンス
はじめに
条件分岐タグ (Conditional Tag) は、テンプレートファイル内で表示される内容や、特定のページ内容を表示する条件を設定するのに使います。例えば、ブログのホームページの上部に短い文を表示させたいとしましょう。is_home()を使えば、簡単に実行できます。
これらのタグはテンプレート階層と深い関わりがあります。
条件の判定
条件分岐タグは、現在のページが指定した条件に合致するかどうかをチェックし、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 を返すのは、表示設定の「トップページの表示」として
- 「最新の投稿」を設定している場合には、メインブログページが表示されるとき
- 「固定ページ (以下を選択)」を設定している場合には、「フロントページ」として選択したページが表示されるとき
- 注: この条件分岐タグは バージョン 2.5 で追加されました。
管理パネル
- 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".
注: 配列を引数に使えるのは バージョン 2.5 以降からです。This function does not distinguish between the post ID, post title, or post name. A post named "17" would be displayed if a post ID of 17 was requested. Presumably the same holds for a post with the slug "17".
先頭固定表示の投稿
- is_sticky()
- 投稿編集ページで「この投稿を先頭に固定表示」のチェックボックスがついている投稿が表示されている場合。もし ID 変数が指定されていない場合、投稿 ID は WordPress ループの投稿のものになる。
- 注: この条件分岐タグは バージョン 2.7 で追加されました。
- is_sticky('17')
- ID 17 の投稿が先頭固定表示の場合、真を返す。
投稿タイプ
- get_post_type()
- Not really a conditional tag, but returns the registered post type of the current post.
- if( get_post_type() == 'book' ) ...
- 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. Note: This ability was added at Version 3.0.
- is_post_type_hierarchical('book')
- Returns true if the book post type was registered as having support for hierarchical.
コメントポップアップ
- is_comments_popup()
- コメントポップアップウィンドウが表示されている場合。
記事を含むページ
- comments_open()
- WordPress ループ内で処理中の記事がコメント受信を受け付けている場合。
- pings_open()
- WordPress ループ内で処理中の記事がピン(ピンバックおよびトラックバック)を受け付けている場合。
WordPress ページ
ここでいう「ページ」とは、WordPressにおける固定ページのことで、いわゆる「Web ページ」とは異なります。詳しくは、「用語について」をご覧ください。
- 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" のいずれかにあてはまるページが表示されている場合。
- 注: 配列を引数に使えるのは バージョン 2.5 以降からです。
サブページかどうかをチェックする
残念ながら、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 ) { // 現在の固定ページが親ページを持つかどうかをチェックします $parentID = $post->post_parent; // 親ページの ID を取得します return $parentID; // 親ページの ID を返します } else { // 親ページを持たないので... return false; // ...false を返します }; };
サブページかどうかのチェックを頻繁にする予定なら、スニペット 1 よりも スニペット 2 のように関数にして利用する方が便利です。
現在のページの親ページが特定の固定ページ、例えば "紹介"(デフォルトでページ ID は 2)かどうかをチェックするならスニペット 3 のようにチェックできます。この方法は、指定したページであるか、またはそのサブページであるかをチェックします。サイトのセクションごとに異なった変数(バナーや見出しなど)を設定するのに便利です。
スニペット 3
<?php if ( is_page('about') || $post->post_parent == '2' ) { // このページは "紹介"、または親ページが "紹介" $bannerimg = 'about.jpg'; } elseif ( is_page('learning') || $post->post_parent == '56' ) { $bannerimg = 'teaching.jpg'; } elseif ( is_page('admissions') || $post->post_parent == '15' ) { $bannerimg = 'admissions.jpg'; } else { $bannerimg = 'home.jpg'; // 上のどれにも当てはまらないページ(たぶんホームページ) } ?>
スニペット 4 はスニペット 3 のチェックをより簡単に実現する関数です。この関数は指定したページ('紹介' など)またはそのサブページ(親ページの ID が 2)であれば true を返します。
スニペット 4
function is_tree($pid) { // $pid = 指定したページの ID global $post; // $post に現在の固定ページの情報をロード $anc = get_post_ancestors( $post->ID ); foreach($anc as $ancestor) { if(is_page() && $ancestor == $pid) { return true; } } if(is_page()&&(is_page($pid))) return true; // 指定したページ、またはそのサブページ else return false; // 別のページです };
スニペット 4 を functions.php ファイルに追加して、is_tree('id') を実行すると現在のページが指定したページ、またはそのサブページであるかどうかがわかります。例えば、スニペット 3 の始めの if ブロック内にある "is_page('about') || $post->post_parent == '2'" は is_tree('2') に置き換えられます。
注意:2階層以上のページ階層がある場合は、親ページは現在より1階層上のページを差します。ページ階層の最上にあるページではないことに注意してください。
ページテンプレート
バージョン 2.5以降から、この条件分岐タグを使って特定のページテンプレートを使っているかどうかをチェックできるようになりました。
- 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" のいずれかにあてはまる場合、真を返す。
- 注: 配列を引数に使えるのは バージョン 2.5 以降からです。
- 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' というスラッグのついたタグのアーカイブページが表示されている場合。
- 注: 配列を引数に使えるのは バージョン 2.5 以降からです。
- has_tag()
- タグのある投稿がループ内で表示されている場合。: 注: これを引数に使えるのは バージョン 2.6 以降からです。
- has_tag('mild')
- 'mild' というタグのある投稿が表示されている場合。
- has_tag(array('sharp','mild','extreme'))
- 配列内のいずれかのタグのある投稿が表示されている場合。
is_archive() と タグテンプレート/en も併せてお読み下さい。
タクソノミーページ
- is_tax()
- タクソノミーのアーカイブページが表示されている場合。
- is_tax('mild')
- 'mild' というスラッグのついたタクソノミーのアーカイブページが表示されている場合。
- is_tax(array('sharp','mild','extreme'))
- 'sharp' または 'mild' または 'extreme' というスラッグのついたタクソノミーのアーカイブページが表示されている場合。
is_archive() も併せてお読み下さい。
A Registered Taxonomy
- is_taxonomy()
- When a particular taxonomy is registered via register_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" という作成者のアーカイブページを表示している場合。
- 注: 配列を引数に使えるのは バージョン 2.5 以降からです。
is_archive() や作成者テンプレート/en も併せてお読み下さい。
日付別ページ
- is_date()
- 日付別のアーカイブページのいずれかが表示されている場合。(例:月別、年別、日別、時間別)
- is_year()
- 年別のアーカイブページが表示されている場合。
- is_month()
- 月別のアーカイブページが表示されている場合。
- is_day()
- 日別のアーカイブページが表示されている場合。
- is_time()
- 毎時別、毎分別、毎秒別のアーカイブページが表示されている場合。
is_archive() も併せてお読み下さい。
アーカイブページ
- is_archive()
- 各アーカイブページが表示されている場合。アーカイブページには、カテゴリー、タグ、作成者、日付別のものがあります。
検索結果ページ
- is_search()
- 検索結果のページが表示されている場合。
404 Not Found ページ
- is_404()
- "HTTP 404: Not Found"エラーページが表示されている場合。
複数にわたるページ
- is_paged()
- 表示中のページが複数のページにわたる場合。これは例えばアーカイブページやメインページに表示する記事数よりも多い記事があり、複数ページに分かれているときを指し、2ページ目以降のときに true を返します。ただし、1つの記事やページの本文が <!--nextpage--> クイックタグで複数ページに分けられている場合は当てはまりません。
添付ファイルページ
- is_attachment()
- 記事またはページの添付ファイルが表示されている場合。添付ファイルは、投稿画面のメディアアップロード機能を使ってアップロードした画像などのファイルの事で、テンプレートを使って独自のページ内に表示できます。詳細は、 画像や添付ファイルの使い方/en をご覧下さい。
シングルページ (固定ページ、個別投稿ページ、添付ファイルページ)
- is_singular()
- is_single()、is_page() 、is_attachment() のいずれかが真である場合。
- is_singular('book')
- True when viewing a post of the post type book. Introduced with Version 3.0.
- is_singular(array( 'newspaper', 'book' ))
- True when viewing a post of the post type newspaper or book. Introduced with Version 3.0.
フィード
- 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 } ?>
ループ内
- in_the_loop()
- ループ内の場合、真を返す。
サイドバー使用中
- is_active_sidebar()
- 指定したダイナミックサイドバーが使用中の場合、真を返す。サイドバー名、ID、番号を指定できる。
- 注: この条件分岐タグは バージョン 2.8 で追加されました。
動作サンプル
以下は条件分岐タグの動作サンプルです。
個別記事
以下は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>
サイドバーの内容をページによって変更する
以下の例では、閲覧中のページによってサイドバーに表示させる内容を変更します。
<!-- サイドバー開始 --> <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 'this is page 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(); ?>