さまざまな条件分岐@WordPress
フロントページを指定
<p class="display_current"> <?php if(is_home()): ?> <small>フロントページです。</small> <?php else: ?> <small>フロントページ以外です。</small> <?php endif; ?> <!-- / .display_current --></p>
この例では is_home() を使っていますが、これはWordPressサイトの設定で「表示設定>フロントページの表示」が「最新の投稿」に設定されている場合です。
フロントページに固定ページを指定している場合には以下の関数を使います。
<p class="display_current"> <?php if(is_front_page()): ?> <small>フロントページを表示しています</small> <?php else: ?> <small>フロントページ以外を表示しています</small> <?php endif; ?> <!-- / .display_current --></p>
フロントページじゃない場合はこれも使えます。
<p class="display_current"> <?php if(!(is_home())): ?> <small>ここはフロントページじゃないです。</small> <?php else: ?> <small>ここはフロントページです。</small> <?php endif; ?> <!-- / .display_current --></p>
固定ページを指定、または除外
ページIDやタイトル、スラッグをパラメータで渡して判断、条件分岐できます。
ページIDを指定
<?php if(is_page('18')): ?> <small>お問合せフォームです。</small> <?php endif; ?>
ページIDを指定して除外
<?php if(!(is_page('18'))): ?> <small>お問合せフォーム以外。</small> <?php endif; ?>
複数を指定する場合には配列を使ってこのように
<?php if(is_page(array('4', '18'))): ?> <small>ページIDが18と4を指定しています。</small> <?php endif; ?>
ページID以外にもページタイトル、スラッグが使えます。
<?php if(is_page('18')): ?> このページのページIDは18です。 <?php endif; ?> <?php if(is_page('お問合せフォーム')): ?> このページのタイトルは "お問合せフォーム" です! <?php endif; ?> <?php if(is_page('inquiry')): ?> このページのスラッグは "inquiry" です! <?php endif; ?>
複数の固定ページをいずれかの場合で指定するにはこのように論理演算子を使います。 (この例ではスラッグを指定してます)
<?php if (is_page('news') || is_page('inquiry')): ?> このページはスラッグが “news” または “inquiry” です。 <?php endif; ?>
投稿(single.php)を指定
関数 is_single() で個別記事、個別のエントリかどうかを判断します。 パラメータを渡し、より細かくIDで指定することもできます。
パラメータはIDの他にも記事タイトルや投稿スラッグでも指定可能。
投稿IDはその投稿の編集画面のURLを見ると確認できます。キャプチャ画像の「post=」の数字の部分ですね。
個別投稿ページ - 条件分岐タグ - WordPress Codex
<?php if(is_single('12')) : ?> この記事のページIDは "12" です。 <?php elseif(is_single(array(12, 10, 9))) : ?> この記事のページIDは "12, 10, 9" のうちのいずれかです。 <?php endif ?>
投稿、カテゴリとそれ以外で分岐する例
<?php if (is_single()) : ?> 投稿ページのときだけ表示される部分 <?php elseif(is_category()) : ?> カテゴリ一覧ページのときだけ表示される部分 <?php else : ?> その他のページで表示される部分 <?php endif ?>
カテゴリーを指定
関数 is_category() でカテゴリーを指定して判断します。 カテゴリのスラッグ、IDで指定できます。
<?php if (is_category('news')) : ?> カテゴリーのスラッグが「news」の時に表示される <?php elseif (is_category()) : ?> カテゴリーのスラッグが「news」以外の時に表示される <?php endif ?>
複数のカテゴリを指定する場合には配列を使って
<?php if (is_category(array(news, life))) : ?> カテゴリーのスラッグが "news" または "life" の時に表示される <?php elseif (is_category()) : ?> カテゴリーのスラッグが "news" と "life" 以外の時に表示される <?php endif ?>
これらの例ではスラッグを指定していますが、IDで指定する場合には指定したいカテゴリの編集画面でURLから確認できます。
キャプチャ画像の「category&tag_ID=」の数字の部分ですね。
カテゴリーページ - 条件分岐タグ - WordPress Codex
固定ページか投稿ページかを指定
<?php if (is_page()) : ?> 固定ページを表示している場合 <?php elseif (is_single()) : ?> 投稿ページを表示している場合 <?php else : ?> 固定ページ、投稿ページ以外を表示している場合 <?php endif ?>
固定ページか投稿ページとそれ以外を指定
<?php if (is_page() || is_single()) : ?> 固定ページまたは投稿ページを表示している場合 <?php else : ?> 固定ページまたは投稿ページ以外を表示している場合 <?php endif ?>
カスタム分類(カスタムタクソノミー)を指定
カスタム分類のスラッグに「seminar-type」のアーカイブ(一覧)ページが表示されている場合。
<?php if(is_tax('seminar-type')): ?> カスタム分類のスラッグが "seminar-type" の場合 <?php endif; ?>
タクソノミーのタームも指定する場合。
<?php if(is_tax('seminar-type', 'brown-pickles')): ?> カスタム分類のスラッグが "seminar-type" で、そのタクソノミーのタームが "brown-pickles" の場合 <?php endif; ?>
関数リファレンス/is tax - WordPress Codex
カスタム分類と固定ページを組み合わせて指定
<?php if(is_page(array('inquiry', 'entry')) || is_tax('seminar-type')): ?> 固定ページのスラッグが "inquiry" または "entry" またはカスタム分類のスラッグが "seminar-type" の場合。 <?php endif; ?>
サブページ(親を持つ子ページかどうか)を指定
WordPressは固定ページにおいて親ページ、子ページという親子関係、階層構造をつけることができます。
しかし、デフォルトではこの「子ページ=サブページ」かどうかを判断する関数がありません。
なので、独自関数を作成して(Codexで紹介されているスニペットを使って)functions.phpに追加します。
/* 親ページを持っているかどうかを判別する関数 */ function is_subpage() { global $post; // $post から表示しているの固定ページの情報を取得 if ( is_page() && $post->post_parent ) { // 表示している固定ページが親ページを持つかどうかを調べる $parentID = $post->post_parent; // 親ページのIDを取得 return $parentID; // 親ページのIDを返す } else { // 親ページを持たない場合は return false; // false を返す }; };
これで子ページを判別するためのタグ is_subpage()が利用できるようになりました。
使いたいテンプレートに以下を記述します。
<?php if(is_subpage()) : ?> 子ページです。 <?php else : ?> 子ページではありません。 <?php endif; ?>
論理演算子を組み合わせて、以下のようにすることも出来ます。
<?php global $post; // 固定ページの情報を取得 if ( is_page() && $post->post_parent ) : ?> 子ページです。 <?php else : ?> 子ページではありません。 <?php endif; ?>
固定ページで、なおかつ親ページを持つかどうかで判断しています。
タグを指定
関数 is_tag() を使い、指定したタグのアーカイブページが表示されているかを判断します。(なので、使うのはarchive.phpやtag.phpです)
引数を渡すことで指定のタグがついた記事を表示します。
引数なしの場合は普通にタグがついた全記事一覧を表示します。
<?php if(is_tag('新商品')): ?> "新商品"タグのついた記事一覧を表示(するアーカイブページを)しています。 <?php elseif(is_tag(array('玄米','秋田','スピリチュアル'))): ?> "玄米", "秋田", "スピリチュアル" のいずれかのタグがついた記事一覧を表示(するアーカイブページを)しています。 <?php endif; ?>
関数 has_tag() を使い、指定したタグを使っているかどうかを判別します。 single.phpのループの中で使用します。
<?php if(has_tag('新商品')): ?> この記事には "新商品" タグがついています。 <?php elseif(has_tag(array('秋田','玄米','スピリチュアル'))): ?> この記事には "秋田, 玄米 ,スピリチュアル" のいずれかのタグがついています。 <?php endif; ?>
検索結果ページが表示されているかどうかを判別する
is_search() で検索結果が表示されているページかどうかを判別します。
以下のコードでは、検索クエリ(検索に使われたワード)と検索結果数も表示します。is_search() 関数を使ってますが、実際に使うのは例えば独自テンプレートを用意せずにindex.phpを使うような場合でしょうか。(検索用テンプレートを用意すればこの関数は不要かと思います)
<?php if (is_search()) : ?> <?php $allsearch =& new WP_Query("s=$s&showposts=-1"); $key = wp_specialchars($s, 1); $count = $allsearch->post_count; echo '<h1>‘'.$key.'’ で検索した結果:'.$count.' 件</h1>'; ?> <?php while (have_posts()) : the_post(); ?> <div class="post"> <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> <ul class="optional"> <li class="date">Published: <?php echo get_post_time('M jS, Y'); ?></li> <li class="category">Category: <?php the_category(', '); ?></li> <?php if(has_tag() == true) : ?> <li class="tags">Tags: <?php the_tags('', ', ', ''); ?></li> <?php else : ?> <?php endif; ?> </ul> <?php the_excerpt(); ?> </div> <?php endwhile; endif; ?>
複数に渡るページ(2ページ目、3ページ目など)かどうか判別する
is_paged() 関数を使うと次のページなど、複数にわたるページの2ページ目移行かどうかを判断出来ます。(is_page()と1字違いなので注意)
<?php if(is_paged()): ?> このページは2ページ目以降です。 <?php endif; ?>
1番最初の記事かどうか判別する
1番最初(最近)の投稿かどうかを判別するための関数です。(ソート順の指定によって変わります、最新の投稿ということではなく、ループで最初に出力する投稿です)
最新の記事だけちょっとデザインを変えるとか、「最新」アイコンを出すとか、制御を分ける際に使えます。
以下のコードをfunctions.phpに追加し、is_first() を使って条件文を書きます。
function is_first(){
global $wp_query;
return ($wp_query->current_post === 0);
}
テンプレート(index.phpとか)での記述(ループ内で使います)
<?php if(have_posts()): while(have_posts()): the_post(); ?> <div class="post"> <?php if (is_first()): ?> <span style="color:#ff0000;">最初の投稿です</span> <?php else: ?> <?php endif; ?> <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> <ul class="optional"> <li class="date">Published: <?php echo get_post_time('M jS, Y'); ?></li> <li class="category">Category: <?php the_category(', '); ?></li> <?php if(has_tag() == true) : ?> <li class="tags">Tags: <?php the_tags('', ', ', ''); ?></li> <?php else : ?> <?php endif; ?> </ul> <?php the_excerpt(); ?> </div> <?php endwhile; endif; ?>
奇数番目、偶数番目の記事を判別する
あまり必要とする機会はなさそうですが、こういうことも出来るとおぼえておくのはいいかもしれません。
奇数番目の記事、偶数番目の投稿を指定して制御するために必要な独自関数です。
それぞれでスタイル、デザインを変えたいときなんかに使えます。
functions.phpに以下を加えて利用します。
/* 奇数番目の記事を判断する関数 is_odd() */ function is_odd(){ global $wp_query; return ((($wp_query->current_post+1) % 2) === 1); } /* 偶数番目の記事を判断する関数 is_even() */ function is_even(){ global $wp_query; return ((($wp_query->current_post+1) % 2) === 0); }
テンプレート(index.phpとか)での記述(ループ内で使います)
<?php if(have_posts()): while(have_posts()): the_post(); ?> <div class="post"> <?php if (is_odd()): ?> <span style="color:#ff0000;">奇数番目の投稿です</span> <?php else: ?> <?php endif; ?> <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> <ul class="optional"> <li class="date">Published: <?php echo get_post_time('M jS, Y'); ?></li> <li class="category">Category: <?php the_category(', '); ?></li> <?php if(has_tag() == true) : ?> <li class="tags">Tags: <?php the_tags('', ', ', ''); ?></li> <?php else : ?> <?php endif; ?> </ul> <?php the_excerpt(); ?> </div> <?php endwhile; endif; ?>
いろいろな方が公開されている記事を参照させていただいてまとめました。
その中でもとくにWeb Designレシピさんの投稿を多く参照させていただきました。ありがとうございます。