WordPressで投稿記事が属するカテゴリーを取得する get_the_category は、属するカテゴリーをカテゴリーの名前順で取得してきます。これは、カテゴリーだけでなく、投稿タグの get_the_tags やカスタム分類での get_the_terms でも同様です。
しかしながら、利用シーンによっては名前以外の順序で取得したい場合もあるのではないでしょうか。今回は、この取得順序を指定できる方法を紹介してみたいと思います。
やり方はいろいろあって、
- get_the_terms のフックを利用する方法
- wp_get_object_terms 関数で orderby パラメータを指定する方法
などもありますが、今回は単純ながらデフォルト取得結果を特定の値で再ソートする方法を採りたいと思います。
というのも、1では引数が自由に取れず特定のカスタマイズしか出来ないこと、2では使う毎にデータベースクエリーが発生するため、多用するとパフォーマンスへの影響が大きくなること、return される値が配列以外に真偽値/オブジェクトの可能性があり対応が多岐になりかねないことによるものです。
それに引き替え、再ソートの方法では、パラメータによって自由なソートが可能、オブジェクトキャッシュに対応しているので、多用してもパフォーマンスへの影響がごく僅かに抑えられる、デフォルトの取得結果は配列に統一されていることなど、他の方法と比較してデメリットが少ないことが挙げられます。
具体的な方針としては、
- 指定可能なパラメータとして、記事のID、ソート用の項目、昇順/降順指定、タクソノミー
- パラメータには、それぞれ初期値を与え、パラメータの指定が無い場合でも動作するようにする
- 取得用の内部関数として get_the_terms を使う
- ソート用項目をキーとしたソート用の連想配列を生成し、ksort/krsort関数で再ソートをかける
といった実装になります。
CODE 1 を functions.phpなどに追加して、取得時に get_ordered_terms を使用すれば、ソート済みの結果を得ることができます。
CODE 1
function get_ordered_terms( $id = 0, $orderby = 'term_id', $order = 'ASC', $taxonomy = 'category' ) { $terms = get_the_terms( $id, $taxonomy ); if ( $terms ) { $ordered = array(); foreach ( $terms as $term ) { if ( isset( $term->$orderby ) ) { $ordered[$term->$orderby] = $term; } } if ( strtoupper( $order ) == 'DESC' ) { $func = 'krsort'; } else { $func = 'ksort'; } $func( $ordered ); return $ordered; } }
記述例:記事の属するカテゴリーをid順に取得
$terms = get_ordered_terms();
記述例:表示中の記事の属するカテゴリーを属する記事の多い順に取得
$terms = get_ordered_terms( 0, 'count', 'DESC' );
記述例:記事IDが238の属する投稿タグをスラッグ順に取得
$terms = get_ordered_terms( 238, 'slug', 'ASC', 'post_tag' );