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


14

如何获得给定学期的顶级父母?

我过去一直wp_get_object_terms在获取帖子中的分类术语,但我不想显示所有标记的术语,而只想显示标记的术语的顶级父母。

因此,如果这些是我选择的条款,我只想显示早餐,午餐和晚餐。

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

我怎样才能做到这一点?

Answers:


22

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

我很乐意看到一个修改,它不仅会打印出顶层术语,而且还会逐层显示顶层父项之下的所有术语。
罗伯特·安德鲁斯

@RobertAndrews如果你只需要一个学期的孩子,你可以使用WordPress的内置get_term_children( $term, $taxonomy )文档)。如果要获取给定术语的顶级父级的所有子级,则可以将上述结果传递给它,如下所示:get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy )
真正的

在这种情况下,$ term是什么?对象,术语名称,前缀的分类法名称编号?在所有情况下,此方法的加载时间都非常长。我一直在等待页面加载几分钟。
罗伯特·安德鲁斯

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行中缺少封闭的括号。
2011年

我需要在$ top_parent中添加$ taxonomy作为第二个参数吗?
2011年

我添加了$ taxonomy参数,但是在使用此代码时出现错误:gist.github.com/1122631
supertrue 2011年

是的,你知道。我更新了答案。
Bainternet'8

1
您的函数似乎坏了,您的foreach循环重叠了,请尝试以下操作:pastebin.com/u48dxzap,如果仍然出现错误,请粘贴所有代码,然后我将进行检查
Bainternet,2011年

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来获取子弹,名称,ID等。只是通过使用$parentObj->slug$parentObj->name作为示例。


2

最简单的方法:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.