2021.11.16
【WordPress】get_the_termsを管理画面に表示されている順番に並び替える方法
get_the_termsをそのまま出力すると管理画面順にならない
並び替えプラグイン Intuitive Custom Post Orderを使用している時、カスタム投稿の詳細ページ(single.php)で get_the_terms() で出力した際に、1記事に対して複数チェックしているタクソノミーが管理画面の順番に出力されない……。という時の備忘録です。
プログラムの流れ
この問題を解決するプログラムの流れは以下になります。
- get_terms() で全タクソノミーを取得
- 記事にチェックされているタクソノミーIDの配列を作成
- ループ処理にてチェックされているタクソノミーIDに一致したものだけを出力
上記のように get_terms() を利用して全てのタクソノミーを基に出力することで管理画面の順番通りに出力することができます。
※並び替えプラグイン(Intuitive Custom Post Order)で変更された並び順は、 get_the_terms() には反映されず、 get_terms() に反映されている事が原因です。
実際のコード
<?php
// 全タクソノミーの取得条件
$args = array(
'hide_empty' => true,
);
// 全タクソノミーを取得
$terms = get_terms( '★タクソノミー名★', $args );
// 記事にチェックされているタクソノミーを取得
$the_terms = get_the_terms( $post->ID, '★タクソノミー名★' );
// 記事にチェックされているタクソノミーIDの配列を作成
$terms_ids = [];
foreach ($the_terms as $the_term) {
$terms_ids[] .= $the_term->term_id;
}
?>
<ul class="term_list">
<?php foreach ($terms as $term): ?>
<?php
// term_idを取得
$term_id = $term->term_id;
// チェックされているタクソノミーのIDと一致すれば出力
if ( in_array( $term_id, $terms_ids ) ): ?>
<?php
$term_name = $term->name; // タクソノミー名
$term_link = get_term_link($term); // リンクURL
?>
<li>
<a href="<?php echo $term_link; ?>"><?php echo $term_name; ?></a>
</li>
<?php endif ?>
<?php endforeach ?>
</ul>
★で囲っているタクソノミー名の部分を差し替えて完成になります。
並べ替えプラグイン(Intuitive Custom Post Order)で並べ替えを有効にしている場合は管理画面の順番通りになってしまいますが、無効にすることで get_terms() を利用しタクソノミーの取得条件の箇所にて、idやslugでの降順・昇順を指定可能です。