确定最低级别的分类术语

时间:2015-01-05 23:15:18

标签: wordpress custom-taxonomy

我有一个自定义的“位置”分类,有3个级别:城市 - >地区 - >郊区。

在访问已标记为城市,地区和郊区的个别帖子时,我还要检索附近的帖子。这意味着,同一郊区的其他帖子。

这为我提供了分配给帖子的所有位置字词:

$terms = wp_get_post_terms( $wp_query->post->ID, 'location' );

我发现如果一个术语的父级等于0,那么它就是一个城市(顶级)。

foreach ( $terms as $term ) {
    if ( $term->parent == 0 ) {

        //$term is a city

    }
}

我的问题是:如何确定哪个词是郊区(最低级别)?

4 个答案:

答案 0 :(得分:4)

我通过计算每个词的祖先来解决这个问题。

使用函数get_ancestors(),您可以获得一个数组,其中包含层次结构中从最低到最高的父项。

这对我有用:

$terms = wp_get_post_terms( get_queried_object_id(), 'location', array( 'orderby' => 'id', 'order' => 'DESC' ) );

$deepestTerm = false;
$maxDepth = -1;

foreach ($terms as $term) {
    $ancestors = get_ancestors( $term->term_id, 'location' );
    $termDepth = count($ancestors);

    if ($termDepth > $maxDepth) {
        $deepestTerm = $term;
        $maxDepth = $termDepth;
    }
}

echo '<pre>';
print_r($deepestTerm);
echo '</pre>';

答案 1 :(得分:1)

遇到同样的问题,但更为一般。这种情况是一个未知的深度,在第一级选择了多个术语。以下是我如何解决它:

function get_lowest_taxonomy_terms( $terms ) {
    // if terms is not array or its empty don't proceed
    if ( ! is_array( $terms ) || empty( $terms ) ) {
        return false;
    }

    $filter = function($terms) use (&$filter) {

        $return_terms = array();
        $term_ids = array();

        foreach ($terms as $t){
            $term_ids[] = $t->term_id;
        }

        foreach ( $terms as $t ) {
            if( $t->parent == false || !in_array($t->parent,$term_ids) )  {
                //remove this term
            }
            else{
                $return_terms[] = $t;
            }
        }

        if( count($return_terms) ){
            return $filter($return_terms);  
        }
        else {
            return $terms;
        }

    };

    return $filter($terms);
}

该函数使用递归返回最低级别的术语。在每次迭代中,它删除没有父项的术语(级别1)和具有父级的术语,这些术语不再包括在过滤术语集合中(级别> 1)。递归通过使用空集并返回上一次迭代的结果而结束。

我的电话看起来像这样:

get_lowest_taxonomy_terms(get_the_terms( get_the_ID(), 'item_location'));

答案 2 :(得分:0)

这是我的简单解决方案。试试这个兄弟!

// Initialize variable
$result = array();
$getParentKeyInArray = array();

// Get the terms
$terms = get_the_terms($post_id, $taxonomy);

// Check if $terms is not empty
if($terms != null) :

    // Get all parent key in the array and add them inside another array
    foreach($terms as $term) :
        $getParentKeyInArray[] = $term->parent;
    endforeach;

    // Next, loop again and this time check if a category ID is not in 
    // $getParentKeyInArray if not then that's the lowest level taxonomy term
    foreach ($terms as $term) :
         if( !in_array($term->term_id, $getParentKeyInArray) ) :
             $result = $term;
         endif;
    endforeach;

endif;

// Check the result
echo '<pre>';
print_r($result);
echo '</pre>';

祝你有美好的一天!

答案 3 :(得分:-1)

这就是ID在父母,子女和孙子之间的作用。举例来说,在你的问题中,你有一个属于这三个的帖子,

  

city - &gt;地区 - &gt;郊区

city的ID编号低于region,而编号ID会低于suburb

考虑到这一点,请按相反的顺序按ID排序您的条款,首先是最高ID。看看wp_get_post_terms。您执行以下操作

$terms = wp_get_post_terms( get_queried_object_id(), 'location', array( 'orderby' => 'id', 'order' => 'DESC' ) );

然后,您可以获得该阵列中的第一个条目,该条目将是您的孙子术语,或最深级别术语,具有最高ID的术语