get_the_category()の順番を親>子>孫に設定する

get_the_category()はちょっと曲者のタグで配列の中身を取得すると親>子>孫の順番ではなくA~Z(50音)順で多次元配列として構成されています。またこの順番の基準はカテゴリー名(name)からソートされています。

サンプルコード

$breaklist = get_the_category();
foreach($breaklist as $key => $val){
    $breaklist[count(get_ancestors($val->term_id, 'category'))] = [
        'name' => $val->cat_name,
        'id' => $val->cat_ID
    ];
}
foreach($breaklist as $cat){
    echo '<a href="' . get_category_link($cat['id']) . '">' . $cat['name'] . '</a>';
}

説明

get_the_category()で抜き出すと親子の順番がバラバラなのでいったん変数に置き換え、foreachで取り出し、多次元配列に追加します。抜き出す際にcat_nameとcat_IDも一緒に抜き出します。これはカテゴリーネームとカテゴリーリンクを取得しています。cat_IDに関してはget_category_link()にパラメータを渡してあげるとURLが返ってきます。

get_ancestors()の引数で$val->term_id'category'指定することで親のterm_idと数を返します。下記はget_ancestors($val->term_id, 'category')の実行結果の例です。これはカテゴリー名によって順番は異なります。この実行結果からわかることは祖先のterm_idを返しterm_idを返さないものは空を返します。つまり、空の配列は親(0)となります。そして配列が1つの場合は子(1)、2つの場合は孫(2)になります。

array(3) {
  [0]=>
  array(2) {
    [0]=>
    int(177)
    [1]=>
    int(159)
  }
  [1]=>
  array(1) {
    [0]=>
    int(159)
  }
  [2]=>
  array(0) {
  }
}

そしてこの連想配列からcount関数を使って$breaklistの連番に割り当てます。連番は0,1,2,3…となるので自動で連番になり、親>子>孫の順になります。

foreach($breaklist as $key => $val){
    $breaklist[count(get_ancestors($val->term_id, 'category'))] = [
        'name' => $val->cat_name,
        'id' => $val->cat_ID
    ];
}

最後に、foreach文で親子順番になった多次元配列を抜き出して終わりです。