このエントリーでは、WordPressでカテゴリーを使った条件分岐のときに使用頻度の高いis_categoryとin_categoryについて。それぞれの違い、具体的な使い方、複数指定、子孫カテゴリ(サブカテゴリー)がある場合などについて解説していきます。
目次
is_category()は、パラメータに何も入れなければ、カテゴリーアーカイブが表示されているかどうかを調べます。
パラメータにIDやスラッグを入れて特定のカテゴリーを指定すれば、現在表示されているのがその指定したカテゴリーアーカイブかどうかを調べます。
<?php if (is_category('sky')) { ?> スラッグがskyのカテゴリ一覧ページのときだけ表示される部分 <?php } ?>
これで、skyのカテゴリ一覧ページのときだけここに書いた内容が表示されます。
複数のカテゴリーを一緒に指定するのであれば以下のように並べて書きます。
ちなみに子(サブ)カテゴリーの場合も同じように並べて書きます。
<?php if (is_category(array('sky','sun','cloud','wind'))) { ?> sky、sun、cloud、windのいずれかのカテゴリ一覧ページで表示される部分 <?php } ?>
子カテゴリーが後から追加になる場合、追加するたびにテンプレートファイルを編集するのも面倒です。
そんなときはcat_is_ancestor_ofを使います。
<?php if (is_category('sky') || cat_is_ancestor_of(5, $cat)) { ?> skyまたはskyの子孫となるカテゴリ一覧ページで表示される部分 <?php } ?>
このように書く事で、skyカテゴリと、skyの子孫カテゴリを対象として結果を表示することができます。
cat_is_ancestor_ofのカッコ内に指定してある5という数字はskyカテゴリのIDだと考えてください。
ここでIDではなくスラッグを使いたい場合、以下のようにカテゴリースラッグをIDに変換します。
<?php if (is_category('sky') || cat_is_ancestor_of(get_category_by_slug('sky')->term_id, $cat)) { ?> skyまたはskyの子孫となるカテゴリ一覧ページで表示される部分 <?php } ?>
ここまではis_category(isのほう)について書いてきましたが、それと似てるものでin_category(inのほう)というのがあります。
in_category()は、ある個別投稿がこのタグで指定したカテゴリに含まれているかどうかを調べるときに使います。
カッコの中にはカテゴリIDやスラッグを書いて具体的なカテゴリを指定します。
<?php if (in_category('sky')) { ?> 投稿がskyカテゴリーに含まれる場合に表示される部分 <?php } ?>
すると、スラッグがskyというカテゴリに含まれる個別投稿のときにここに書いた内容が表示されます。
WordPressにおいてカテゴリというのは一階層だけではなく複数の階層にして整理して使っているサイトも多いはずです。
in_categoryで親カテゴリを指定すれば子カテゴリも対象に・・・なんかなりそうな感じがしてしまいますが、実際は記事の編集画面でチェックを入れたカテゴリのみを対象とし、親カテゴリとか子カテゴリとかは関係ありません。つまり子カテゴリのみにチェックを入れて、親カテゴリにはチェックを入れていない場合、親カテゴリを対象とした結果を表示しません。
親カテゴリがskyで、その子カテゴリにsun、cloud、windがあるとしましょう。
投稿記事がこれらのカテゴリいずれかに含まれているかどうかを調べたいときは、親や子という関係は特に気にせず以下のようにカテゴリを複数並べて指定すればOKです。
<?php if (in_category(array('sky','sun','cloud','wind'))) { ?> sky、sun、cloud、windのいずれかに含まれる場合に表示される部分 <?php } ?>
ちなみに、子カテゴリーが後から増えることが想定される場合に備えるのであればin_categoryと一緒にpost_is_in_descendant_categoryというのを指定します。
これにより、skyもしくはskyの子孫カテゴリに含まれているかどうかを調べることが可能になります。
詳しい書き方についてはCodexを参照。
なお、WordPressで条件分岐の基本的な書き方については以前に以下のエントリーで解説しましたのでそちらもあわせてご参考にしてみてください。