koike

【WordPress】記事が属する子タームを親タームのID順で並び替えて表示させる

今回は親タームのIDを基準に子ターム一覧の並び順を制御する方法をご紹介したいと思います。

 やりたいこと

  • 記事が複数の子タームを持つとき、ターム一覧を親タームのID順で表示させる
  • 親タームごとでスタイルをつける(図では背景色を親タームごとに設定)

img150731-01

 ターム構成

ターム構成は下図のようなものを想定します。

img150731-02

■タクソノミー:基本情報(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>';
}

ただし、このままではタームの登録順によって意図しない表示になってしまいます。(下図参照)

img150731-03

(色の並びを合わせたい!=親の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" に変更します。

新しいウェブ体験を作ろう TAMのPWA開発
お問い合わせはこちら