例えばこういう、親子関係のあるカテゴリ構成があったとします
勇者
ー時の勇者
ー風の勇者
ー神に選ばれし勇者
ある記事を「勇者 風の勇者」のカテゴリに指定した場合、普通にget_the_category()を使うと「勇者 風の勇者」ではなく機械的にアルファベット順に「風の勇者 勇者」と並べられてしまってヴァーとなることがあります
試行錯誤で2パターンほど対処法を試したので両方メモしておきます
解法その1
参考にさせていただいた記事です。ありがとうございます!
カスタムタクソノミーに親子関係(階層)を持たせ、複数選択したタームの並び順を親>子の順番に表示する
※「children[]」という箇所が自分の環境では動作しなかったので、自分なりに書き換えましたが、ちょっと頭の悪い処理かもしれません。ごめん。
functions.php
//引数として与えた配列を親子順に function getRootTaxonomies($terms=null){ $rootterms = array(); $roottermstemp = array(); if(isset($terms)) { foreach($terms as $k=>$v){ if($v->parent === 0){ $rootterms[] = $v; } } foreach($rootterms as $k=>$v) { $i = 0; foreach($terms as $sk=>$sv){ $childname = 'child'.$i; if( $v->term_id === $sv->parent){ $rootterms[$k]->$childname = $sv; $i++; } } } } return $rootterms; }
テンプレートの該当箇所
slug; ?> //カテゴリを出力したい場合 =$pv->name; ?> $childname && $pv->$childname->name != ''){ ?> //スラッグを出力したい場合 = $pv->$childname->slug; ?> //カテゴリを出力したい場合 =$pv->$childname->name; ?>
解法その2
こっちの方法では、階層の同じカテゴリを複数指定した場合はうまくいかないです。
参考にさせていただいたのは下記の二つの記事です。ありがとうございます!
カテゴリIDを階層順に並べた配列をつくる Wordpressテーマの作り方
カテゴリIDからカテゴリ名/スラッグを取得する
function.php
//所属カテゴリ一覧を親子順に function get_categories_tree() { $post_categories = get_the_category(); $cat_trees = array(); $cat_counts = array(); $cat_depth_max = 10; foreach ( $post_categories as $post_category ) { $depth = 0; $cat_IDs = array($post_category->cat_ID); $cat_obj = $post_category; while ( $depth < $cat_depth_max ) { if ( $cat_obj->category_parent == 0 ) { break; } $cat_obj = get_category($cat_obj->category_parent); array_unshift($cat_IDs, $cat_obj->cat_ID); $depth++; } array_push($cat_trees, $cat_IDs); array_push($cat_counts, count($cat_IDs)); } $depth_max = max($cat_counts); $cat_key = array_search($depth_max, $cat_counts); $cat_tree = $cat_trees[$cat_key]; return $cat_tree; } //カテゴリIDからカテゴリ名とスラッグ取得 function get_category_name_by_id($cat_ID,$type) { $cat_ID = (int) $cat_ID; $category = get_category($cat_ID); if($type == 'name'){ return $category->cat_name; } elseif($type == 'slug') { return $category->slug; } }
テンプレートの該当箇所
//スラッグを出力したい場合 = get_category_name_by_id($categorytree[$i], slug); ?> //カテゴリを出力したい場合 = get_category_name_by_id($categorytree[$i], name); ?>