例えばこういう、親子関係のあるカテゴリ構成があったとします
勇者
ー時の勇者
ー風の勇者
ー神に選ばれし勇者
ある記事を「勇者 風の勇者」のカテゴリに指定した場合、普通に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); ?>