WordPressでカテゴリ(terms)オブジェクトをツリー順に並び替える方法
WordPressにカテゴリ用のテンプレートタグが用意されていますが、とっても使い辛い。。。カテゴリ情報だけ欲しいんだ!自分で自作しちゃえ!って時に困るのが、get_terms関数を使って全てのカテゴリを取得すると並び順が変。そのため、カテゴリ情報を並び替える関数を作ってみました。カテゴリだけでは無くデータ構造が同じタクソノミーも並び替えれるはず。
全てのカテゴリ情報の取得
詳しくはWordPressで全てのカテゴリー構造を取得する方法という記事を書いたのでそれを参考にしてください。get_terms()関数を使用します。
$cats = get_terms( 'category', 'fields=all&get=all&orderby=id' );
あれ?詳しく書いている気がするぞ。。。
取得したカテゴリ情報をソートする関数
SQLをじかに書いてソートする方法も考えたのですが、うまくソートできなかったのでphp側で処理しました。ソートしたものをキャッシュさせると幸せになれるかもしれません。
function sort_terms($cats,$parent=0,$depth=0) {
//$parentに属するカテゴリを$new_catsに抜き出す。
$new_cats = array();
foreach ($cats as $cat) {
if ((int)$cat->parent === (int)$parent) {
$cat->depth = $depth;
$new_cats[] = $cat;
}
}
//$new_catsをバブルソート
$len = count($new_cats);
for ($m=0; $m<$len; $m++) {
for ($n=$len-1; $n>$m; $n--) {
//前の要素が大きい場合
if ($new_cats[$n-1]->term_id > $new_cats[$n]->term_id) {
$temp = $new_cats[$n];
$new_cats[$n] = $new_cats[$n-1];
$new_cats[$n-1]= $temp;
}
}
}
//再帰的に下位カテゴリを結合
$nnew_cats = array();
foreach ($new_cats as $cat) {
$nnew_cats[] = $cat;
$add_cats = sort_terms($cats,$cat->term_id,$depth+1);
$nnew_cats = array_merge($nnew_cats,$add_cats);
}
return $nnew_cats;
}
クイックソートしようかな?と思ったのですが件数が少ないのと実装が面倒(おぃ)だったのでバブルソートにしています。キャッシュさせれば良いんじゃ!
関数名はタクソノミーで使用することを考えるとsort_categoryだと変なのでsort_termsにしました。
使い方
簡単です。
$cats = get_terms( 'category', 'fields=all&get=all&orderby=id' ); $cats = sort_terms($cats); print_r($cats);
文章履歴
- 2010/10/21 term_idでソートするように変更
- 2010/10/20 記事作成
最後に
またまた久しぶりです。WordPress自体もすごく久しぶりな気がします。。。
ちょっとPRになるのですが、実家の印刷業では年末に向けて2011年 年賀状印刷用のサイトを立ち上げました。よろしければどうぞ。
あわせて読む
コメント投稿