获取自定义分类术语的顶级父项

时间:2011-08-03 作者:supertrue

如何获得给定学期的顶级家长?

我正在使用wp_get_object_terms 为了在帖子上获取分类术语,而不是显示所有标记的术语,我只想显示标记术语的顶级父级。

因此,如果这些是我选择的术语,我只想展示早餐、午餐和晚餐。

x BREAKFAST
   x Cereal
   x Eggs
  LUNCH
     Hamburger
   x Pizza
  DINNER
     Fish
        Bass
      x Salmon
        Trout
     Lasagna
我该怎么做?

8 个回复
最合适的回答,由SO网友:supertrue 整理而成

感谢Ivaylo提供的这段代码,它是基于Bainternet的答案。

下面的第一个函数,get_term_top_most_parent, 接受术语和分类法,并返回术语的顶级父级(或术语本身,如果它是无父级的);第二个功能(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;
}

SO网友:markd

自3.1.0以来,get_ancestors() 可用。它返回层次结构中从最低到最高的祖先数组。

SO网友:Bainternet

下面是一个简单的函数,它将为您获取任何给定术语中最顶层的父术语:

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;
    }
}

SO网友:Kiet
/**
 * 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 );
}
SO网友:user3328615

我也有同样的问题,我很容易就解决了。查看以下内容:

定义$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 例如。

SO网友:Vincent Wasteels

Easiest way:

$rootId = end( get_ancestors( $term_id, \'my_taxonomy\' ) );
$root = get_term( $rootId, \'my_taxonomy\' );
echo $root->name;
SO网友:Alois Kratochwill

也许这有助于:get_ancestors( $object_id, $object_type );

codex.wordpress.org

SO网友:Ivan Flores Casasempere

Try this!

function get_term_top_most_parent( $term_id, $taxonomy ) {
    $ancestors = get_ancestors( $term_id, $taxonomy );

    if(!empty($ancestors)){
        $parentID = end( $ancestors );
    }else{
        $parentID = $term_id;
    }
    return $parentID;
}
结束

相关推荐

WP_SET_OBJECT_Terms()无法设置术语

好了,伙计们,这是一个场景。我正在尝试设置一个函数,该函数将自动将一篇帖子(发布时)复制到另一种帖子类型。因此,一篇常规的博客文章被发布,发布后,它的所有信息都被复制到一个自定义的帖子类型(对于WP电子商务),自动为该博客文章创建一个存储条目。我编写了一个函数,该函数负责提取所有信息,并使用wp\\u insert\\u post()将其插入到新帖子中。这一切都很好,除了一件事。我正在使用wp\\u set\\u object\\u terms()根据博客文章的标记设置新产品的商店类别ID。然而,由于某些