とある案件で、カスタムタクソノミーを追加する際に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関数をお試しください。