どもです。
カテゴリが多くて多階層なサイトのサイドバーに良さそうなコードを作りました。
例えば「親」「子」「孫」カテゴリがあったとして、トップレベルは記事のあるもの全てが表示されます。
「親」ページのときは、「親」の下の「子」カテゴリ覧まで、
「子」ページのときは、「親」の下の「子」の下の「孫」カテゴリ一覧まで表示されます。
また、singleページは所属する全てのカテゴリが最下層まで表示されます。
function sideTermList($wp_query,$taxonomy){
$customPostType = get_post_type();
//所属するtermの取得
$term_parents = array();
$selected_term = array();
if(is_category()||is_tax()||is_single()){
if(is_single()){
$term_now = get_the_terms($post->id, $taxonomy);
}else if(is_category()||is_tax()){
$page_taxonomy = $wp_query->get_queried_object();
$term_now = get_term($page_taxonomy->term_id, $taxonomy);
}
if(is_array($term_now)){
foreach($term_now as $term){
$selected_term[] = $term->term_id;
$term_parent = get_term($term->term_id, $taxonomy);
for($i = 1; $i <= 100; $i++){
$term_parents[] = $term_parent->term_id;
if($term_parent -> parent == 0){
break;
}
$term_parent = $term_parent -> parent;
$term_parent = get_term($term_parent, $taxonomy);
}
}
}else{
$selected_term[] = $term_now->term_id;
$term_parent = get_term($term_now->term_id, $taxonomy);
for($i = 1; $i <= 100; $i++){
$term_parents[] = $term_parent->term_id;
if($term_parent -> parent == 0){
break;
}
$term_parent = $term_parent -> parent;
$term_parent = get_term($term_parent, $taxonomy);
}
}
}else{
$term_parents[] = 0;
$selected_term[] = 0;
}
//再帰関数termChildListの宣言
function termChildList($terms_id,$term_parents,$selected_term,$taxonomy){
$terms = get_terms( $taxonomy, 'parent='.$terms_id );
foreach ($terms as $term){
echo'<li'; if(in_array($term->term_id,$selected_term)===true)echo' class="current-cat"'; echo'><a href="'. get_term_link($term->slug, $taxonomy). '">'; echo $term->name; echo'</a>';
if(in_array($term->term_id, $term_parents) === true){
$categories = get_term_children( $term->term_id, $taxonomy );
if(!empty($categories)){
echo'<ul>';
termChildList($term->term_id,$term_parents,$selected_term,$taxonomy);
echo'</ul>';
}
}
echo'</li>';
}
}
//呼び出し
$terms_id = 0;
termChildList($terms_id,$term_parents,$selected_term,$taxonomy);
}
使うときは、
<ul>
<?php sideTermList($wp_query,'タクソノミー名'); ?>
</ul>
post投稿の場合は、'category'でおkです。
現在のカテゴリはliにcurrent-catクラスがつきます。
最上層のulは表示されないので、既存のulの中に設置することもできます。