子ターム表示順番を変更。get_terms_childrenよりget_termsが便利

- WordPress -
2019.12.05
WordPress

子ターム名だけをページ内アンカーリンクとして設置したくて以下の1行目のようにget_terms_children()を使って子タームだけを取得していた。※product_catというカスタムタクソノミーの例

$term_children = get_term_children( $current_term->term_id, 'product_cat'); // 子タームid取得
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>";
}

これで構築途中までは良かったんですが、Intuitive Custom Post Order等のプラグインを使って「タームの順番を管理画面からドラッグアンドドロップで変更したい」という要望があったことを思い出し、いざ管理画面で順番を変えてみても順番が変わらないことに気付く。

こんなとき、get_terms_children()ではなくget_terms()を使うと思い通りにいく。

子タームを管理画面で並んでいる順番で表示するならget_terms

以下1行目の'orderby' => 'none'がポイントで、get_termsなら取得後の並び順を簡単に指定できる。

$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順でも文字順でもなく管理画面に並んでいる順番で取得してくれるので、これで管理画面からドラッグアンドドロップで順番を上下させるたびに表示順番も従って変わることが確認できた。

参考サイト子ターム名と記事一覧をtaxonomy.phpに表示させる際に子タームの順番を指定したい