WP: get_termsを親子関係にソートする
WordPress、タームをソートする。ひとつの方法として、配列を別の配列の順序で並べ替える。
- wp_dropdown_categoriesでツリー構造HTMLを変数に格納し、
- preg_match_allで整形し配列に格納、
- この配列を順序としてget_termsで取得した配列をソートする。
$taxonomy = 'region';
// タームの親子構造の配列を取得
$tree_terms = wp_dropdown_categories('taxonomy='.$taxonomy.'&hierarchical=1&echo=0&value_field=slug');
//print_r($tree_terms);
// slugとnameを抜き出し配列に入れる
preg_match_all('/value="(.*?)">(.*?)</', $tree_terms, $matches);
//print_r($matches);
//print_r($matches[1]); //slug
//print_r($matches[2]); //name
// タームのオブジェクトの配列で取得
$terms = get_terms($taxonomy);
//print_r($terms[0]->name);
// 親子構造にタームを並べ替えとnameを変更
$order = $matches[1];
$array1 = $terms;
$sorted_array = [];
foreach ($order as $i => $search_id) {
foreach ($array1 as $idx => $record) {
if ($search_id == $record->slug) {
$record->name = $matches[2][$i];
$sorted_array[] = $record;
unset($array1[$idx]);
break;
}
}
}
$array1 = $sorted_array;
//print_r($array1);
$terms = $sorted_array;解説
wp_dropdown_categoriesでツリー構造HTMLを変数に格納する。
$tree_terms = wp_dropdown_categories('taxonomy=region&hierarchical=1&echo=0&value_field=slug');$tree_termsの中身<select name="cat" id="cat" class="postform"> <option class="level-0" value="%e8%bf%91%e7%95%bf">近畿</option> <option class="level-1" value="%e7%a5%9e%e6%88%b8"> 神戸</option> <option class="level-1" value="%e5%a4%a7%e9%98%aa"> 大阪</option> <option class="level-1" value="%e4%ba%ac%e9%83%bd"> 京都</option> <option class="level-1" value="%e5%b0%bc%e5%b4%8e"> 尼崎</option> <option class="level-1" value="%e5%a5%88%e8%89%af"> 奈良</option> <option class="level-0" value="%e9%96%a2%e6%9d%b1">関東</option> <option class="level-1" value="%e4%b8%8b%e7%94%b0"> 下田</option> <option class="level-1" value="%e6%9d%b1%e4%ba%ac"> 東京</option> <option class="level-1" value="%e6%a8%aa%e6%b5%9c"> 横浜</option> <option class="level-1" value="%e7%ae%b1%e6%a0%b9"> 箱根</option> <option class="level-0" value="%e4%b9%9d%e5%b7%9e">九州</option> <option class="level-1" value="%e9%95%b7%e5%b4%8e"> 長崎</option> <option class="level-0" value="%e4%b8%ad%e9%83%a8">中部</option> <option class="level-1" value="%e6%96%b0%e6%bd%9f"> 新潟</option> <option class="level-1" value="%e9%95%b7%e9%87%8e"> 長野</option> <option class="level-0" value="%e5%8c%97%e6%b5%b7%e9%81%93">北海道</option> <option class="level-1" value="%e5%87%bd%e9%a4%a8"> 函館</option> </select>
$tree_termsをpreg_match_allで整形し配列に格納
preg_match_all('/value="(.*?)">(.*?)</', $tree_terms, $matches);()で囲むと後方参照な感じで、$matches[1]、$matches[2]として格納される。Keyword:WPソート
参考リンク
walkerについて
PHP - 連想配列を任意の配列順番に並び替えしたい|teratail ベストアンサー
$array1 = [
['id'=>31,'name'=>"test1"],
['id'=>29,'name'=>"test2"],
['id'=>22,'name'=>"test3"],
['id'=>23,'name'=>"test4"],
['id'=>24,'name'=>"test5"],
];
$order = [29,31,24,23,22];
$sorted_array = [];
foreach ($order as $search_id) {
foreach ($array1 as $idx => $record) {
if ($search_id == $record['id']) {
$sorted_array[] = $record;
unset($array1[$idx]);
break;
}
}
}
$array1 = $sorted_array;
var_dump($array1);PHP - php多次元配列へのアクセス方法|teratail ベストアンサー
print_r($time->id)これ、オブジェクトへのアクセスの方法ですよね? 配列は$item[index][key or index]でアクセスする必要があるのでは…?
PHP: プロパティの値の設定および取得 - Manual データオブジェクトのプロパティ
<?php $company->name = 'Acme'; ?>
テンプレートタグ/wp dropdown categories - WordPress Codex 日本語版
関数リファレンス/get terms - WordPress Codex 日本語版
説明欄でソート
説明欄を使ってカテゴリー・タグクラウドの並び順を変える方法
タクソノミーを一覧にする時に自由に並び替えをしたい | WordPress.org
