子ターム表示順番を変更。get_terms_childrenよりget_termsが便利
「Intuitive Custom Post Order等のプラグインを使ってフロントに表示される子タームの順番を、WordPress管理画面のターム一覧でドラッグ&ドロップすることで変更したい」
という要件のとき、
get_terms_children()では順番変更が反映されず、
get_terms()を使うと管理画面通りに反映された
というお話です。
ちょっと細かいですが、僕の例を書いておくと、
子タームのスラッグをページ内アンカーリンクとして設置したくて以下の2行目のようにget_terms_children()を使って子タームだけを取得していました。※product_catというカスタムタクソノミーの例
PHP// 現在表示しているproduct_catの子ターム取得
$term_children = get_term_children( $current_term->term_id, 'product_cat');
// 子タームのスラッグでアンカーリンクを生成
foreach ( $term_children as $child ) {
$child_term = get_term_by( 'id', $child, 'product_cat' );
echo "<li><a href='#".esc_attr($child_term->slug)."'><span>".esc_html($current_term->name.' '.$child_term->name)."</span></a></li>";
}
これだと、いざ管理画面のターム一覧から子ターム表示順番をドラッグ&ドロップで上下させて変えてみてもフロントで表示順番が変わらないことに気付いて「ダメじゃん」となりました。
こんなとき、get_terms_children()ではなくget_terms()を使うと思い通りにいったのでした。
子タームを管理画面で並んでいる順番で表示するならget_terms
以下1行目get_terms()の'orderby' => 'none'がポイント。
PHP// 現在表示しているproduct_catの子ターム取得
$term_children = get_terms('product_cat', array('child_of' => $current_term->term_id, 'orderby' => 'none'));
// 子タームのスラッグでアンカーリンクを生成
foreach ( $term_children as $child ) {
$child_term = get_term_by( 'id', $child->term_id, 'product_cat' );
echo "<li><a href='#".esc_attr($child_term->slug)."'><span>".esc_html($current_term->name.' '.$child_term->name)."</span></a></li>";
}
noneにすると、id順でも文字順でもなく管理画面に並んでいる順番で取得してくれるので、これで管理画面からドラッグアンドドロップで子タームの順番を上下させるたびに表示順番も従って変わることが確認できました。