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