我有一个自定义的“位置”分类,有3个级别:城市 - >地区 - >郊区。
在访问已标记为城市,地区和郊区的个别帖子时,我还要检索附近的帖子。这意味着,同一郊区的其他帖子。
这为我提供了分配给帖子的所有位置字词:
$terms = wp_get_post_terms( $wp_query->post->ID, 'location' );
我发现如果一个术语的父级等于0,那么它就是一个城市(顶级)。
foreach ( $terms as $term ) {
if ( $term->parent == 0 ) {
//$term is a city
}
}
我的问题是:如何确定哪个词是郊区(最低级别)?
答案 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的术语