大阪・神戸・奈良・京都を中心にNPOのWEB制作やITサポートをしています。
【WordPress】記事に設定したカスタムタクソノミーのタームの並び順を好きな並び順にする方法

兵庫県宝塚市XXXXの賃貸 | Typesプラグインデモ1

近頃ではカスタムポストタイプとカスタムタクソノミーを使わない案件はほぼ無いと言っても過言では無くなってきた気がします。
今回はそのカスタムタクソノミーのタームの並び順のことについてです。

全タームの一覧の並び順を好きに変更したいならプラグインで可能

サイドメニューなどにカスタムタクソノミーで設定したターム一覧を全件表示し、その並び順を好きな並び順にしたい場合は以下のプラグインを利用すれば好きな並び順にすることが出来ます。

PS Taxonomy Expander

http://wordpress.org/plugins/ps-taxonomy-expander/

私は必ずといって良いほどこのプラグインは使います。カスタムタクソノミーのタームを制御するのに色々便利な設定が出来ます。

Term order ‹ Typesプラグインデモ1 — WordPress

プラグインをインストールすると「Term order」というメニューが現れ、設定したカスタムタクソノミーのタームの並び順をドラッグ・アンド・ドロップで変更出来ます。

カスタムタクソノミーのターム一覧を表示したい箇所に以下のコードを書きます。


<?php wp_list_categories( 'title_li=&taxonomy=タクソノミー名&orderby=order' ); ?>

名称未設定.php

以下の作者のサイトで詳しい記載されています。
http://www.warna.info/archives/451/

Category Order and Taxonomy Terms Order

http://wordpress.org/plugins/taxonomy-terms-order/

こちらのプラグインは使ったことないですが、「PS Taxonomy Expander」と同じようにドラッグ・アンド・ドロップで並び順の変更が可能です。

Taxonomy Order ‹ Typesプラグインデモ1 — WordPress

記事ごとに設定したタームを表示した場合の並び順を好きにしたい

全部のタームを出力し並び順を好きにしたい場合、上記で記載した「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で任せたいんだけど、、、致し方なく・・・・

GistのURL:https://gist.github.com/tkc49/5625795

6件のコメントがあります

  1. この記事を参考にさせていただいて、思い通りに出力できました!ありがとうございました。

コメントを残す

メニューを閉じる