カスタム分類用語の最上位の親を取得します


14

特定の用語のトップレベルの親を取得するにはどうすればよいですか?

wp_get_object_terms投稿の分類用語を取得するために使用していますが、すべてのタグ付き用語を表示するのではなく、タグ付き用語の最上位の親のみを表示します。

これらが私の選択した用語である場合、私は朝食、昼食、夕食のみを表示したいです。

x BREAKFAST
   x Cereal
   x Eggs
  LUNCH
     Hamburger
   x Pizza
  DINNER
     Fish
        Bass
      x Salmon
        Trout
     Lasagna

これどうやってするの?

回答:


22

Bainternetの答えに基づいたこのコードを提供してくれたIvayloに感謝します。

以下の最初の関数get_term_top_most_parentは、用語と分類法を受け入れ、用語の最上位の親(または、親がない場合は用語自体)を返します。2番目の関数(get_top_parents)はループ内で機能し、分類法を指定すると、投稿の用語のトップレベルの親のHTMLリストを返します。

// Determine the top-most parent of a term
function get_term_top_most_parent( $term, $taxonomy ) {
    // Start from the current term
    $parent  = get_term( $term, $taxonomy );
    // Climb up the hierarchy until we reach a term with parent = '0'
    while ( $parent->parent != '0' ) {
        $term_id = $parent->parent;
        $parent  = get_term( $term_id, $taxonomy);
    }
    return $parent;
}

上記の関数を取得したら、返された結果をループして、wp_get_object_terms各用語の上位の親を表示できます。

function get_top_parents( $taxonomy ) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    $top_parent_terms = array();

    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term, $taxonomy );
        //check if you have it in your array to only add it once
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }

    // build output (the HTML is up to you)
    $output = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          //Add every term
          $output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
    $output .= '</ul>';

    return $output;
}

最上位の用語を印刷するだけでなく、最上位の親の下にあるすべての用語を階層的に印刷する変更を参照してください。
ロバートアンドリュース

@RobertAndrews単一の用語の子だけが必要な場合は、WordPressの組み込みget_term_children( $term, $taxonomy )documentation)を使用できます。特定の用語の最上位の親のすべての子を取得する場合は、次のように上記の結果を渡すことができますget_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy )
スーパートゥルー

この場合の$ termとは何ですか。オブジェクト、用語の名前、接頭辞のtaxonomyname_number?いずれの場合も、このメソッドはロードに非常に時間がかかります。数分間、ページが読み込まれるのを待っていました。
ロバートアンドリュース

1
最初に書かれたように、IDが必要でしたが、回答を編集して用語IDまたはWP_Termオブジェクトを許可しました。このコードの問題を報告しているのあなただけではありません。理想的には、WPの組み込みget_ancestors関数を使用するように書き直す必要があります。テストする時間があったときに新しい回答を投稿します。
スーパートゥルー


8

これは、任意の用語の最上位の親用語を取得する単純な関数です。

function get_term_top_most_parent( $term_id, $taxonomy ) {
    $parent  = get_term_by( 'id', $term_id, $taxonomy );
    while ( $parent->parent != 0 ){
        $parent  = get_term_by( 'id', $parent->parent, $taxonomy );
    }
    return $parent;
}

この関数を取得したら、次によって返された結果をループできますwp_get_object_terms

$terms =  wp_get_object_terms( $post->ID, 'taxonomy' );
$top_parent_terms = array();
foreach ( $terms as $term ) {

    //Get top level parent
    $top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );

    //Check if you have it in your array to only add it once
    if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
        $top_parent_terms[] = $top_parent;
    }
}

ありがとう!今これを試しています。参考までに、関数の1行目には親括弧がありません。
スーパートゥルー

$ top_parentの2番目のパラメーターとして$ taxonomyを追加する必要がありますか?
スーパートゥルー

$ taxonomyパラメーターを追加しましたが、このコードを使用するとエラーが発生します。gist.github.com
supertrue

そうだね。答えを更新しました。
Bainternet

1
:あなたの関数は、あなたのforeachループは、このしようと重なっている壊れたようだpastebin.com/u48dxzapを、あなたはまだ取得する場合、エラーがあなたのすべてのコードを貼り付け、私がチェックします
Bainternet

5
/**
 * Get top level term
 */
function get_top_level_term($term,$taxonomy){
    if($term->parent==0) return $term;
    $parent = get_term( $term->parent,$taxonomy);
    return get_top_level_term( $parent , $taxonomy );
}

1
コードとともに説明を追加してください。
s_ha_dum

4

同じ問題があり、簡単に解決しました。これをチェックしてください:

定義し$taxonomyます。データを取得する分類法のスラッグになります。これを行った後、あなたは単にこれを行うことができます:

<?php
    $postterms = wp_get_post_terms($post->ID, $taxonomy);   // get post terms
    $parentId = $postterms[0]->parent;                      // get parent term ID
    $parentObj = get_term_by('id', $parentId, $taxonomy);   // get parent object 
?>

これで次のようになりました:

object(stdClass)#98 (11) {
  ["term_id"]=>
  int(3)
  ["name"]=>
  string(8) "Esportes"
  ["slug"]=>
  string(8) "esportes"
  ["term_group"]=>
  int(0)
  ["term_taxonomy_id"]=>
  int(3)
  ["taxonomy"]=>
  string(17) "noticiaseditorias"
  ["description"]=>
  string(0) ""
  ["parent"]=>
  int(0)
  ["count"]=>
  int(4)
  ["object_id"]=>
  int(123)
  ["filter"]=>
  string(3) "raw"
}

また$parentObj、slug、name、idなどを取得するために使用できます。$parentObj->slugまたはを例$parentObj->nameとして使用します。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.