问题描述
我有一个分层的自定义分类法,我可以使用 print_r(get_the_terms( $post->ID, 'taxonomic_rank' ));
显示:
Array
(
[46] => stdClass Object
(
[term_id] => 46
[name] => Aplocheilidae
[slug] => aplocheilidae
[term_group] => 0
[term_taxonomy_id] => 53
[taxonomy] => taxonomic_ranks
[description] =>
[parent] => 39
[count] => 1
[object_id] => 443
)
[47] => stdClass Object
(
[term_id] => 47
[name] => Aplocheilus
[slug] => aplocheilus
[term_group] => 0
[term_taxonomy_id] => 54
[taxonomy] => taxonomic_ranks
[description] =>
[parent] => 46
[count] => 1
[object_id] => 443
)
[39] => stdClass Object
(
[term_id] => 39
[name] => Cyprinodontiformes
[slug] => cyprinodontiformes
[term_group] => 0
[term_taxonomy_id] => 52
[taxonomy] => taxonomic_ranks
[description] =>
[parent] => 0
[count] => 1
[object_id] => 443
)
)
此分类法将始终采用以下形式:Order(parent)> 家庭 (订单的孩子)> Sub-family(家庭的孩子)
是否有一个快捷方便的方式以正确的顺序显示这些分类,以便打印出以下内容? Order: <order>, Family: <family>, Sub-family: <sub-family>
提前致谢
最佳解决方案
可能有更好的方法可以做到这一点,但总是可以做三个简单的 foreach
循环。
我写了一个功能很好的示例功能,应该为您服务是一个很好的起点:
function print_taxonomic_ranks( $terms = '' ){
// check input
if ( empty( $terms ) || is_wp_error( $terms ) || ! is_array( $terms ) )
return;
// set id variables to 0 for easy check
$order_id = $family_id = $subfamily_id = 0;
// get order
foreach ( $terms as $term ) {
if ( $order_id || $term->parent )
continue;
$order_id = $term->term_id;
$order = $term->name;
}
// get family
foreach ( $terms as $term ) {
if ( $family_id || $order_id != $term->parent )
continue;
$family_id = $term->term_id;
$family = $term->name;
}
// get subfamily
foreach ( $terms as $term ) {
if ( $subfamily_id || $family_id != $term->parent )
continue;
$subfamily_id = $term->term_id;
$subfamily = $term->name;
}
// output
echo "Order: $order, Family: $family, Sub-family: $subfamily";
}
让它居住在您的 functions.php
文件中,并在您的模板中使用它:
print_taxonomy_ranks( get_the_terms( $post->ID, 'taxonomic_rank' ) );
注意:循环相同的阵列三次听起来有点愚蠢,但另一方面它是一个快速和容易的解决方案,易于阅读,扩展和维护。
次佳解决方案
虽然 Maugly 的方法看起来更可读,但在阵列上运行了 3 次循环似乎对我来说是不对的。所以这里只是另一种方法,对于一些但是没有运行循环 3 次的工作而言,它们的读取可能性较差。
function print_taxonomy_ranks( $terms ) {
// if terms is not array or its empty don't proceed
if ( ! is_array( $terms ) || empty( $terms ) ) {
return false;
}
foreach ( $terms as $term ) {
// if the term have a parent, set the child term as attribute in parent term
if ( $term->parent != 0 ) {
$terms[$term->parent]->child = $term;
} else {
// record the parent term
$parent = $term;
}
}
echo "Order: $parent->name, Family: {$parent->child->name}, Sub-Family: {$parent->child->child->name}";
}
第三种解决方案
我有一种情况,一个帖子可以被标记为多个类别组,以及父类别中的多个孩子,所以我希望我的层次结构能反映出来。我也只是想要几行代码:
$terms = get_the_terms($id, 'department_categories');
foreach($terms as $key => $term){
if($term->parent != 0){
$terms[$term->parent]->children[] = $term;
unset($terms[$key]);
}
}
基本上,它找到一个类别的父代,它将它作为一个孩子移动到父的 obj,然后将其从数组中的原始位置删除。我已经使用多个兄弟姐妹,孩子和不同级别的类别进行了测试。
希望有人发现这是有用的,以防他们只是寻找一些逻辑指导而不是”plugin”!
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。