web-dev-qa-db-ja.com

最も深い用語のみを割り当てて、階層的分類法パスを出力する方法

たとえば、次の3つのレベルに分類される分類法があるとしましょう。 A > B > C

次に、投稿を作成して「C」という用語に割り当てます。
ここでのケースでは、単一の課題のみが存在します。それは事が起こったイベントです。

投稿のページでは、割り当てられた用語だけでなく、階層パスを出力したいと思います。そのため、投稿が "C"にのみ割り当てられている場合でも、途中でこれらの各用語のアーカイブページへのリンクを含む "A> B> C"を表示したいと思います。

get_the_term_listはそれをしないでしょう、そして私が一週間非常に悪い検索語を使っていない限り、これは明らかにするのが非常に困難であり、そして私が見つけることができたあらゆる解決策は何らかの方法で壊れています。 (分類学用語のデータベースID値の順序に関する仮定を真剣に要求している人もいます。)
これが私の正確なケースに対処しているように思われる 一例 です。それは……私のインストール環境では何も出力しません。そしてvar_dump($links_string)"string(0) "";"のようなものを生成します( "---"が表示される箇所は2つあり、1つのダッシュにまと​​めてください)。

私は何かが足りないのですか?

Iしたくないしたくないことに注意してください。

  • 階層の下にあるすべての用語を手動で割り当てる。明らかに必要ではありません。構造例の "A"のアーカイブページにアクセスすると、WordPressはすべてのサブタームの投稿を喜んでリストしているので、明らかにそれは階層を見るための何らかの方法を持っています。
    • あなたがクライアントを持っていたことがあるなら、あなたはこれがただ成し遂げられないことを知っています。
  • パン粉。これらはすべてサイトのルートを一覧表示することから始まり、投稿のタイトルで終わるため、クリーンアップするのは非常に困難です。たとえば、Yoast SEOの実装では、空白のデータを含むルート、および外部のフィルタを使用して投稿のタイトルを削除することができますが、末尾の項目区切り文字で終わらないようにすることはできません。
    • また、私が何らかの理由で見つけたすべてのブレッドクラム実装は、(投稿への)単一の構成された分類パスを表示する単一の関数を提供することにそれ自身をロックします。私はたくさんの分類法を持っていて、結局他のものを同様の方法でリストする必要があるかもしれないので、tellそれにどんな分類法を使うかをさせるジェネリック関数が必要です。
1
Su'

投稿の用語を取得するには get_the_terms を使用し、次に取得するには get_ancestors を使用しますその用語の親IDの配列。

$tax = 'category';
$terms = get_the_terms( get_the_ID(), $tax );
if( $terms && ! is_wp_error( $terms ) ){
    // check for and output any ancestors
    $ancestors = array_reverse(get_ancestors( $terms[0]->term_id, $tax ));
    if( $ancestors ){
        foreach( $ancestors as $ancestor ){
            $parent = get_term( $ancestor, $tax );
            if( $parent && ! is_wp_error( $parent ) ){
                echo $parent->name;
                echo get_term_link( $parent );
            }
        }
    }
    // output directly assigned term
    echo $terms[0]->name;
    echo get_term_link( $terms[0] );
}
2
Milo