WP: get_termsを親子関係にソートする

Quick Edit Pencil

WordPress、タームをソートする。ひとつの方法として、配列を別の配列の順序で並べ替える。


  1. wp_dropdown_categoriesでツリー構造HTMLを変数に格納し、
  2. preg_match_allで整形し配列に格納、
  3. この配列を順序として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">&nbsp;&nbsp;&nbsp;神戸</option>
 <option class="level-1" value="%e5%a4%a7%e9%98%aa">&nbsp;&nbsp;&nbsp;大阪</option>
 <option class="level-1" value="%e4%ba%ac%e9%83%bd">&nbsp;&nbsp;&nbsp;京都</option>
 <option class="level-1" value="%e5%b0%bc%e5%b4%8e">&nbsp;&nbsp;&nbsp;尼崎</option>
 <option class="level-1" value="%e5%a5%88%e8%89%af">&nbsp;&nbsp;&nbsp;奈良</option>
 <option class="level-0" value="%e9%96%a2%e6%9d%b1">関東</option>
 <option class="level-1" value="%e4%b8%8b%e7%94%b0">&nbsp;&nbsp;&nbsp;下田</option>
 <option class="level-1" value="%e6%9d%b1%e4%ba%ac">&nbsp;&nbsp;&nbsp;東京</option>
 <option class="level-1" value="%e6%a8%aa%e6%b5%9c">&nbsp;&nbsp;&nbsp;横浜</option>
 <option class="level-1" value="%e7%ae%b1%e6%a0%b9">&nbsp;&nbsp;&nbsp;箱根</option>
 <option class="level-0" value="%e4%b9%9d%e5%b7%9e">九州</option>
 <option class="level-1" value="%e9%95%b7%e5%b4%8e">&nbsp;&nbsp;&nbsp;長崎</option>
 <option class="level-0" value="%e4%b8%ad%e9%83%a8">中部</option>
 <option class="level-1" value="%e6%96%b0%e6%bd%9f">&nbsp;&nbsp;&nbsp;新潟</option>
 <option class="level-1" value="%e9%95%b7%e9%87%8e">&nbsp;&nbsp;&nbsp;長野</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">&nbsp;&nbsp;&nbsp;函館</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

このブログの人気の投稿

PowerShellのGetDetailsOf メソッドでプロパティの詳細情報のID番号と項目名を列挙します

PowerShellで複数ファイルのプロパティを取得する方法(準備編)

書字方向 横書方向変換スクリプト 左書きから右書きへ(コピペ用途)

ヤバい!JAPANNEXT WQHD対応 27型ワイド液晶ディスプレイ「JN-IPS2716WQHD」を注文してみた!!!

決定版 Edgeでローカルファイルを開く パワーシェルスクリプト (ウインドウズでドロップレット)

PowerShellでJPG画像のリサイズとウォーターマーク画像との合成を同時に行う

Blender: 辺の長さを数値で指定するアドオン