web-dev-qa-db-ja.com

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

特定の用語のトップレベルの親を取得する方法

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

したがって、これらが私の選択した用語であれば、朝食、昼食、夕食だけを見せたいのです。

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

これどうやってするの?

13
supertrue

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

以下の最初の関数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;
}
21
supertrue

3.1.0以降、 get_ancestors() が利用可能になりました。階層の最下位から最上位までの先祖の配列を返します。

19
markd

これはあなたに任意の与えられた用語の一番上の親の用語を取得させる簡単な関数です:

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;
    }
}
8
Bainternet
/**
 * 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 );
}
5
Kiet

私は同じ問題を抱えていました、そして私は簡単に解決しました。これをチェックしてください。

$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を使用して、スラッグ、名前、IDなどを取得できます。例として$parentObj->slugまたは$parentObj->nameを使用するだけです。

4
user3328615

最も簡単な方法:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;
2

多分これは助けになるでしょう:get_ancestors( $object_id, $object_type );

codex.wordpress.org

0