WordPressで、
サイドバーのウィジェットを特定のカテゴリーに属する、全てのサブカテゴリー、小カテゴリーの記事で表示するにはどうすればよいか?
まず、Widget Logic プラグインをインストールする。
Widget Logic
Widget Logic lets you control on which pages widgets appear using WP's conditional tags. It also adds a 'widget_content' filter.
次に、条件式を検討する。
どのような条件式にすればよいか?
A→ B,C,D,E,F,G,H
AというカテゴリーにはBというサブカテゴリー、Cという子カテゴリーがある。
B,CカテゴリーはAカテゴリーに属している。
例えば、
旅々→ タイ、マレーシア、支那、ヨーロッパ、アフリカ
というカテゴリー構造の場合。
is_category(’旅々”)
だけでは、支那、タイ等のカテゴリーの記事では表示されない。旅々カテゴリーのトップページか、旅々カテゴリーのみに属する記事にしか表示されない。
post_is_in_descendant_category が鍵
- まず、post_is_in_descendant_category が使えるように functions.php に次のコードを挿入する。
<?php /** * Tests if any of a post's assigned categories are descendants of target categories * * @param int|array $cats The target categories. Integer ID or array of integer IDs * @param int|object $_post The post. Omit to test the current post in the Loop or main query * @return bool True if at least 1 of the post's categories is a descendant of any of the target categories * @see get_term_by() You can get a category by name or slug, then pass ID to this function * @uses get_term_children() Passes $cats * @uses in_category() Passes $_post (can be empty) * @version 2.7 * @link http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category */ if ( ! function_exists( 'post_is_in_descendant_category' ) ) { function post_is_in_descendant_category( $cats, $_post = null ) { foreach ( (array) $cats as $cat ) { // get_term_children() accepts integer ID only $descendants = get_term_children( (int) $cat, 'category' ); if ( $descendants && in_category( $descendants, $_post ) ) return true; } return false; } } ?>
2. 親カテゴリー名が「旅々」、そのスラッグ(URL)が'travel' 、そのカテゴリーIDが16であれば、次のようなコードになる。
in_category( '旅々' ) || post_is_in_descendant_category(16)
又は、
in_category( 'travel' ) || post_is_in_descendant_category(16)
カテゴリーIDは、ダッシュボード→投稿→カテゴリー を開いて、「旅行」カテゴリーをクリックするとアドレスバーに次のようにID=16 と表示される。
/wp-admin/edit-tags.php?action=edit&taxonomy=category&tag_ID=16&post_type=post&......
Widget logic の設定欄に記入する。
ちなみに、
is_category()
の他に、
in_category()
has_category()
もあるが、これだけではだめである。