カスタムタクソノミーで追加したタクソノミーのターム一覧をusort関数で並べ替える方法

カスタムタクソノミーで追加したタクソノミーのターム一覧をusort関数で並べ替える方法

カスタムタクソノミーで追加したタクソノミーのターム一覧をusort関数で並べ替える方法

とある案件で、カスタムタクソノミーを追加する際にhierarchical(階層)をfalseにして、タグ形式のタクソノミーを追加しました。タームの並び順をスラッグの降順にしたかったのですが、通常のパラメータ指定では並び順が変わってくれませんでした。(おそらく環境依存の問題)

結局パラメータ指定ではなくPHPのusort関数で並べ替えることができたので、その方法を備忘録として残しておきたいと思います。

カスタムタクソノミーで追加したタグの一覧を並べ替えて表示させる方法

get_termsのパラメータ指定で並べ替える方法

本来であれば、下記のようにget_termsのパラメータにorderbyとorderを追加することで並べ替えできます。ですが、該当の環境では、下記の方法では並び順は変わってくれませんでした。

<?php
//タグ一覧取得
$tags = get_terms(array(
  'taxonomy' => 'news_tag', //タクソノミー名
  'hide_empty' => false,
  'orderby' => 'slug',
  'order' => 'DESC',
));

if (!empty($tags) && !is_wp_error($tags)):
?>
  <ul>
    <?php
    foreach ($tags as $tag) {
      echo '<li><a href="' . get_term_link($tag) . '">#' . esc_html($tag->name) . '</a></li>';
    }
    ?>
  </ul>
<?php endif; ?>

同じ環境で、WordPressに標準で入っている”タグ”の場合は、下記で並べ替えできることを確認しています。逆に謎です…

<?php
//タグ一覧取得
$tags = get_terms(array(
  'taxonomy' => 'post_tag',
  'hide_empty' => false,
  'orderby' => 'slug',
  'order' => 'DESC',
));

if (!empty($tags) && !is_wp_error($tags)):
?>
  <ul>
    <?php
    foreach ($tags as $tag) {
      echo '<li><a href="' . get_term_link($tag) . '">#' . esc_html($tag->name) . '</a></li>';
    }
    ?>
  </ul>
<?php endif; ?>

usort関数を使って並べ替える方法

そんなわけで、usort関数を使って並び順を変更することにしました。下記のように、取得したターム一覧をusort関数で並べ替えます。

<?php
//タグ一覧取得
$tags = get_terms(array(
  'taxonomy' => 'news_tag', //タクソノミー名
  'hide_empty' => false,
));

//スラッグで並べ替え
usort($tags, function ($a, $b) {
  return strcmp($b->slug, $a->slug);
});

if (!empty($tags) && !is_wp_error($tags)):
?>
  <ul>
    <?php
    foreach ($tags as $tag) {
      echo '<li><a href="' . get_term_link($tag) . '">#' . esc_html($tag->name) . '</a></li>';
    }
    ?>
  </ul>
<?php endif; ?>

上記はスラッグの降順で並べ替えていますが、昇順にしたい場合は下記のようにします。
※$a->slugと$b->slugを入れ替えているだけです。

<?php
//タグ一覧取得
$tags = get_terms(array(
  'taxonomy' => 'news_tag', //タクソノミー名
  'hide_empty' => false,
));

//スラッグで並べ替え
usort($tags, function ($a, $b) {
  return strcmp($a->slug, $b->slug);
});

if (!empty($tags) && !is_wp_error($tags)):
?>
  <ul>
    <?php
    foreach ($tags as $tag) {
      echo '<li><a href="' . get_term_link($tag) . '">#' . esc_html($tag->name) . '</a></li>';
    }
    ?>
  </ul>
<?php endif; ?>

あとがき

get_termsのorderbyとorderが効かなかった原因はよくわかりませんでしたが、usort関数で無事並べ替えすることができました。

他のサイトではorderbyとorderを指定して並べ替えできるので、環境依存の問題だとは思います。なのであまり参考にはならないかもしれませんが、ターム一覧などの並べ替えがうまくいかない時はusort関数をお試しください。

この記事が気に入ったら
いいね!してね♪

Twitter で

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です