記事ページに登録されているカスタムタクソノミーのタームを全体の登録件数降順で表示する

WordPress

カスタムタクソノミーが複数存在するサイトで、タームを全て表示したいと思った時に実行した内容です。

やりたいことは

  • 投稿ページ(記事ページ)に複数のカスタムタクソノミーのタームをリンク付きで表示
  • 上記タームに属する、全体の投稿件数を表示
  • 全体の登録件数順(降順)に並べ替え

です。

例えば「ドラえもん」に関する投稿があったとして、登録されているカスタムタクソノミーが以下だとします。(情報はWikipediaより抜粋した適当なものですよ)

  • ジャンル…児童漫画、少年漫画
  • 掲載誌…コロコロコミック、てれびくん
  • 出版地域…中国、ベトナム、フィリピン

この場合に、以下のように表示させたい!ということです。

少年漫画(20件) 中国(18件) 児童漫画(15件) コロコロコミック(10件) ベトナム(8件) てれびくん(5件) フィリピン(3件)

「タームをリンク付きで表示」ということであれば簡単な方法がありました。

ですがこれでは今回やりたかったことがかなわなかったので別の方法を模索しました。

あまりスマートではない気がするので、もっときちんとした方法があるかもですが。。

今後のためのメモです。

記事ページの記述したい箇所(例えば single.php)に以下のように記述することで表示されました。

<?php
// 組み込み以外のカスタムタクソノミーを取得 
$args = array(
	'public'   => true,
	'_builtin' => false
);
$output = 'names'; // or objects
$operator = 'and'; // 'and' or 'or'
$taxonomies = get_taxonomies( $args, $output, $operator );

// 記事に属するタクソノミー情報を取得
$terms_obj = get_the_terms( $post->ID, $taxonomies );

// タームオブジェクトを登録件数順にソート
foreach($terms_obj as $key => $value){
	$modified[$key] = $value -> count;
}
array_multisort( $modified, SORT_DESC, $terms_obj );

foreach ( $terms_obj as $term ){
	echo '<a href="'.get_term_link( $term->slug, $term->taxonomy ).'" class="tag">'.$term->name.'('.$term->count.'件)</a>  ';
}
?>

参考ページ

500 Internal Server Error
PHPの多次元連想配列のソート - Qiita
ただの配列であれば簡単にソートは出来てしまいますが、それが多次元であったときのソート方法です。 こんな配列があったと仮定します。 multisort.php $array = array( array( 'id' => 0, ...

array_multisort の使い方ではハマりました。。

配列とオブジェクトの扱い方をごちゃ混ぜにしていたのでずっと $value[“count”] としていて値を取得できませんでした。これを $value -> count としたことでうまくいきました。

タイトルとURLをコピーしました