web-dev-qa-db-ja.com

階層に基づいて、投稿の2つの分類用語を一覧表示する方法

私は get_the_terms を使用して、分類法の "location"に関連付けられた2つの用語を投稿に表示しています。用語は郊外と街です。ロケーション分類は階層的であるため、郊外は市の子です。

投稿編集画面では、ユーザーが自分の都市を選択し、続いて自分の郊外(選択した都市に基づいて郊外のリストを表示)を選択します。どちらもドロップダウンメニューから選択できます。

私の問題は、用語が投稿に出力されると、アルファベット順に表示され、場合によっては市が最初に表示されることです。

Alpha (City), Beta (Suburb) 

私は彼らが彼らの階層を反映することを必要とします、それで彼らは常に郊外によって最初にリストされて、それから都市です。

Beta (Suburb), Alpha, (City)

これが私のコードです。

<?php
$terms = get_the_terms ($post->id, 'location');

if ( !is_wp_error($terms)) : ?>

<li id="location">

<?php unset($locations);
foreach ($terms as $term) {
    $locations[] = $term->name;
    }

$location = join(", ", $locations);
?>

<?php echo $location; ?>

</li>
<?php endif ?>

これは、 wp_list_categories を使用した方がよいでしょうか。 「階層的」というオプションがあるようですが、その使い方がわからないので、投稿の用語を理解するだけで、すべてを理解することはできません。

1
Andrew

私はwp_get_object_termsを使ってこれを一緒にハックすることができました。 'orderby' => 'term_id'が最も役に立ちました。これはおそらく最良の方法ではありませんが、うまくいくようです。子用語(郊外)は常に親用語(Cities)の後に作成されるので、それらは常により高いIDを持ちます。

<?php 
$terms = wp_get_object_terms($post->ID, 'location', array('orderby' => 'term_id', 'order' => 'DESC') );

if ( !empty( $terms ) ) :

    $location = array();
    foreach ( $terms as $term ) {
         $location[] = $term->name;
    }
    echo implode(', ', $location);  

endif; 
?>
2
Andrew

私はあなたの場合これを達成するための最も簡単な方法は配列を逆にすることであろうと思います。

foreach ($terms as $term) {
    $locations[] = $term->name;
}
$locations = array_reverse($locations);

これを行うにはもっと複雑な方法がありますが、これはあなたの状況にはうまくいくはずだと思います。

1
tollmanz