问题描述
如何获得给定期限的 top-level 家长?
我正在使用 wp_get_object_terms
在帖子上获取分类术语,但不是显示所有标记的条款,我只想显示标记词语 「top-level」 父母。
所以如果这些是我选择的条款,我只想展示早餐,午餐和晚餐。
x BREAKFAST
x Cereal
x Eggs
LUNCH
Hamburger
x Pizza
DINNER
Fish
Bass
x Salmon
Trout
Lasagna
我该怎么做?
最佳解决方案
感谢 Ivaylo 的代码,这是基于 Bainternet 的答案。
第一个函数 (get_term_top_most_parent
) 接受术语 ID 和分类,并返回该术语的 top-level 父项 (或术语本身,如果是无父母); 第二个函数 (hey_top_parents
) 在循环中工作,并且给定一个分类法,返回一个帖子条款的 top-level 祖先。
// determine the topmost parent of a term
function get_term_top_most_parent($term_id, $taxonomy){
// start from the current term
$parent = get_term_by( 'id', $term_id, $taxonomy);
// climb up the hierarchy until we reach a term with parent = '0'
while ($parent->parent != '0'){
$term_id = $parent->parent;
$parent = get_term_by( 'id', $term_id, $taxonomy);
}
return $parent;
}
// so once you have this function you can just loop over the results returned by wp_get_object_terms
function hey_top_parents($taxonomy, $results = 1) {
// get terms for current post
$terms = wp_get_object_terms( get_the_ID(), $taxonomy );
// set vars
$top_parent_terms = array();
foreach ( $terms as $term ) {
//get top level parent
$top_parent = get_term_top_most_parent( $term->term_id, $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)
foreach ( $top_parent_terms as $term ) {
$r = '<ul>';
$r .= '<li><a href="'. get_term_link( $term->slug, $taxonomy ) . '">' . $term->name . '</a></li>';
}
$r .= '</ul>';
// return the results
return $r;
}
次佳解决方案
自 3.1.0 起,get_ancestors()
可用。它在层次结构中返回一个从最低到最高的祖先数组。
第三种解决方案
这是一个简单的功能,可以让您获得任何特定术语的最高级别的术语:
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;
}
}
第四种方案
/**
* 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 );
}
第五种方案
我有同样的问题,我很容易解决。看一下这个:
定义 $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
作为例子。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。