问题描述

我有一个分层的自定义分类法,我可以使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。