今回は親タームのIDを基準に子ターム一覧の並び順を制御する方法をご紹介したいと思います。
● やりたいこと
- 記事が複数の子タームを持つとき、ターム一覧を親タームのID順で表示させる
- 親タームごとでスタイルをつける(図では背景色を親タームごとに設定)
● ターム構成
ターム構成は下図のようなものを想定します。
■タクソノミー:基本情報(info_cat)
○店舗(親ターム)
-梅田店
-なんば店
-心斎橋店
○分類(親ターム)
-メンズ
-レディース
-キッズ
○アイテム(親ターム)
-トップス
-ボトムス
-シューズ
-バック
(注:投稿時、親タームにはチェックを入れないものとします。)
● ターム一覧の表示
まず、記事が所有するターム一覧を下記のような方法で出力してみます。
(archive.phpなどで記事を一覧表示させ、その各記事ごとに属するタームを表示させる場合)
$terms = wp_get_object_terms($post->ID,'info_cat'); if (!empty($terms) && !is_wp_error($terms)) { echo '<ul class="cat">'; foreach ($terms as $term) { echo '<li class="cat-'.esc_attr($term->parent).'">'.esc_html($term->name).'</li>'; } echo '</ul>'; }
ただし、このままではタームの登録順によって意図しない表示になってしまいます。(下図参照)
(色の並びを合わせたい!=親のID順で昇順に並べたい)
● 比較関数 usort()を利用
そこでPHPの比較関数 usort()で並び替えを実現したいと思います。
●function.phpに下記を追記
function cmp_parent( $a, $b ) { if ( $a->parent == $b->parent ) { return 0; } return ( $a->parent > $b->parent ) ? 1 : -1; }
●子ターム一覧を表示している部分を下記に書き換えます。
(定義した関数をforeachの前で呼び出します。)
$terms = wp_get_object_terms($post->ID,'info_cat'); if (!empty($terms) && !is_wp_error($terms)) { echo '<ul class="cat">'; usort($terms,"cmp_parent"); foreach ($terms as $term) { echo '<li class="cat-'.esc_attr($term->parent).'">'.esc_html($term->name).'</li>'; } echo '</ul>'; }
降順で表示したい場合は、
return ( $a->parent > $b->parent ) ? 1 : -1;
の部分の "$a->parent > $b->parent" を "$a->parent $b->parent" に変更します。