确定最低级别的分类术语

Determine lowest level taxonomy term

我有一个自定义 'location' 分类法,有 3 个级别:城市 -> 区域 -> 郊区。

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

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

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

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

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

        //$term is a city

    }
}

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

这就是术语 ID 在 parent、child 和 grandchild 之间的工作方式。举个例子,你有一个属于所有三个的 post,在你的问题中,

city -> region -> suburb

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

考虑到这一点,请按 ID 倒序排列您的条款,最高 ID 在前。看看wp_get_post_terms。您执行以下操作

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

然后您可以获得该数组中的第一个条目,这将是您的大child 术语,或最深层次的术语,具有最高 ID

的术语

遇到了同样的问题,但更普遍。情况是深度未知,并且在第一层选择了多个术语。这是我解决它的方法:

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

函数returns使用递归得到最低层的项。在每次迭代中,它会删除没有父项(第 1 级)的术语和不再包含在已过滤术语集中的具有父项的术语(级别 > 1)。递归以空集结束并返回前一次迭代的结果。

我的电话应该是这样的:

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

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

使用函数 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>';

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

// 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>';

祝你有愉快的一天!