近頃ではカスタムポストタイプとカスタムタクソノミーを使わない案件はほぼ無いと言っても過言では無くなってきた気がします。
今回はそのカスタムタクソノミーのタームの並び順のことについてです。
目次
全タームの一覧の並び順を好きに変更したいならプラグインで可能
サイドメニューなどにカスタムタクソノミーで設定したターム一覧を全件表示し、その並び順を好きな並び順にしたい場合は以下のプラグインを利用すれば好きな並び順にすることが出来ます。
PS Taxonomy Expander
http://wordpress.org/plugins/ps-taxonomy-expander/
私は必ずといって良いほどこのプラグインは使います。カスタムタクソノミーのタームを制御するのに色々便利な設定が出来ます。
プラグインをインストールすると「Term order」というメニューが現れ、設定したカスタムタクソノミーのタームの並び順をドラッグ・アンド・ドロップで変更出来ます。
カスタムタクソノミーのターム一覧を表示したい箇所に以下のコードを書きます。
<?php wp_list_categories( 'title_li=&taxonomy=タクソノミー名&orderby=order' ); ?>
以下の作者のサイトで詳しい記載されています。
http://www.warna.info/archives/451/
Category Order and Taxonomy Terms Order
http://wordpress.org/plugins/taxonomy-terms-order/
こちらのプラグインは使ったことないですが、「PS Taxonomy Expander」と同じようにドラッグ・アンド・ドロップで並び順の変更が可能です。
記事ごとに設定したタームを表示した場合の並び順を好きにしたい
全部のタームを出力し並び順を好きにしたい場合、上記で記載した「wp_list_categories」関数を使えば一覧をリストで表示し、プラグインで設定した並び順で並び替えてくれます。
ですが、single.phpなどでその記事に設定しているタームだけの一覧を表示する場合は、「wp_list_categories」を使うと全タームが出力されてしまう為、「wp_get_post_terms」関数を使うことになります。引数の記事のIDを渡せれるので、その記事に設定されたタームだけを取得することが可能です。以下のような感じで書くとリストで表示出来ます。
<ul> <?php $lists = wp_get_post_terms($post->ID,'タクソノミー名'); ?> <?php foreach($lists as $list): ?> <li><a href="<?php echo esc_url(get_term_link($list,'タクソノミー名')); ?>" title="<?php echo esc_attr($list->name); ?>"><?php echo esc_html($list->name); ?></a></li> <?php endforeach; ?> </ul>
でも残念ながら上記のコードだとプラグインで変更した並び順が反映されません。
※wp_get_post_termsの引数に並び順を制御する引数があるのですが、その引数ではプラグインで設定した並び順通りに制御することは出来ない。
所属している記事の件数や、名前、スラッグなで並び替えは可能です。
プラグインで設定した並び順通りにタームを反映させたい場合
以下のコードをfunctions.phpに追記してください。
<?php // functions.php に追記 function terms($a, $b){ if ( intval($a->term_order) == intval($b->term_order)) { return 0; } return (intval($a->term_order) < intval($b->term_order)) ? -1 : 1; } function terms_sort($terms, $object_ids, $taxonomies, $args){ if(!is_admin()){ usort($terms , "terms"); } return $terms; } add_filter('wp_get_object_terms','terms_sort',99,4); ?>
そうするとプラグインで設定した並び順通りに、記事が所属しているタームの一覧が表示されます。
上記コードでは何をしてるかというと、上記で説明したプラグインを有効化するとtermsテーブルにterm_orderというカラムが作成されます。
wp_get_object_termsフィルターで取得したtermsの中に上記プラグインで追加されたterm_orderの値が取得できるので、その値を使ってPHP側でソートをしています。
※ソートはSQLで任せたいんだけど、、、致し方なく・・・・
ピンバック: [WordPress]カスタムタクソノミーに親子関係(階層)を持たせ、複数選択したタームの並び順を親>子の順番に表示する | tipsBear
ピンバック: カスタムタクソノミーの一覧取得と位置変更について | mirano.jp
ピンバック: 【study】wordpressプラグイン | マイブロ
ピンバック: WordPressに複数カテゴリ対応のGoogle対応したパンくずリストをつける | KennyQi
この記事を参考にさせていただいて、思い通りに出力できました!ありがとうございました。
ピンバック: Category Order and Taxonomy Terms Order - ネットアンサー備忘録|ネットアンサー備忘録
ピンバック: WordPressプラグイン |