显示类别X中最深的子类别(在循环中)

时间:2012-06-07 作者:TheLoneCuber

我有许多顶级类别,包括“新闻”和“体育”。它们都有多个级别的子类别,如下所示。

  • News

    <澳大利亚新南威尔士州悉尼

    Sports

    <在我的循环中,我想显示一个类别-what ever is the deepest child category of "Sport".

    我在StackOverflow上找到了一些代码returns the deepest child category, 但不是来自specific category. 它返回所有顶级类别中最深的子类别。因此,如果一个帖子分为两类(悉尼和铁人三项),代码显示悉尼是最深的儿童类别。我需要具体说明我希望最深的孩子来自哪个顶级类别。在这种情况下,这将是“运动”,因此,最深的儿童猫将是“铁人三项”。

4 个回复
SO网友:Tom J Nowell

您在问题中引用的代码有缺陷。在大多数情况下,它会起作用,但它依赖于一个假设,即新的子术语是在其父母之后创建的,因此具有更高的ID。

要愚弄您发布的代码,请执行以下操作:

创建新类别编辑较大的子术语将其父术语更改为新类别确保其具有不同的深度。您还存在另一个特殊性问题。在您的示例中,您指定它应该在sport中查看,而不是全部,但代码如何知道在sport中具体查看?这听起来像是您计划将运动类别名称或ID硬编码到您的代码中,我STRONGLY 建议反对。相反,post meta value或metabox UI会更好,但并不理想。

您的问题可以概括为:

给定一个帖子a和一个词B,那么帖子a中B最深的子词是什么?其中,B属于分类“类别”。

这给我们带来了两个新问题:

如何确定术语A是否包含术语B这些问题的答案将实现以下两个功能:

  • get_term_depth( $term ) - 返回术语的父级深度或数目is_term_ancestor( $term, $ancestor ) - 这个术语是另一个术语的祖先吗?返回true或false这些函数不是WordPress core的一部分,需要编写。

    但如果使用这两个函数,我们就可以做到这一点:

    function get_deepest_child_term( $terms, $specific_term ) {
        $deepest_term = $specific_term;
        $deepest_depth = get_term_depth( $specific_term );
        foreach ( $terms as $term ) {
            if ( is_term_ancestor( $term, $specific_term ) ) {
                $depth = get_term_depth( $term );
                if ( $depth > $deepest_depth ) {
                    $deepest_term = $term;
                    $deepest_depth = $depth;
                }
            }
        }
        return $deepest_depth;
    }
    
    您可以这样使用:

    $terms = wp_get_object_terms( $post_id, \'category\' );
    $sport_term = get_term_by( \'slug\', \'sport\', \'category\' );
    $deepest_term = get_deepest_child_term( $terms, $sport_term );
    echo $deepest_term->name;
    
    您会注意到,我直接使用了分类术语API,而没有使用更高级别的中间人,例如get_the_category. 这样,代码对于自定义分类法同样有效。E、 g.产品类别。

    实施get_term_depth 以及is_term_ancestor 我将此作为一项任务留给读者,并鼓励他们提出两个新问题,因为它们各自都是有用且有趣的问题。重要的是将任务分解成更小的部分,重复这个过程,直到每个部分都可以解决或很小。这两个函数都需要理解递归才能实现。

SO网友:fdsa

好吧,我最初误解了你的问题。

function getLowestCategory()
{
    $postCategories = get_the_category();
    for ($I = 0;$I<sizeof($postCategories);$I++)
    {
        //this is a top level category
        if ($postCategories[$I])
        {
            continue;
        }
        for ($J=0;J<sizeof($postCategories);$J++)
        {
            //if another category lists it as its parent, it cannot be the lowest category 
            if (strcmp($postCategories[$I]->name,$postCategories[$J]->category_parent)==0)
            break;
        }
        //at this point, no other cateogry says it\'s its parent, therefore it must be the lowest one
        return $postCategories[$I]->name;
    }
}

SO网友:Muhammad Saqib Sarwar

基于上述想法,我已经解决了一个类似的问题,并创建了一个要点viewed here.

首先,我创建了一个函数来获取术语的深度

function inspiry_get_term_depth( $term_id, $term_taxonomy ) {
    $term_ancestors = get_ancestors( $term_id, $term_taxonomy );
    if ( $term_ancestors ) {
        return count( $term_ancestors );
    }
    return 0;
}
然后我在下面的代码中使用它

$the_terms = get_the_terms( $post_id, $breadcrumbs_taxonomy );

    if ( $the_terms && ! is_wp_error( $the_terms ) ) :

        $deepest_term = $the_terms[0];
        $deepest_depth = 0;

        // Find the deepest term
        foreach( $the_terms as $term ) {
            $current_term_depth = inspiry_get_term_depth( $term->term_id, $breadcrumbs_taxonomy );
            if ( $current_term_depth > $deepest_depth ) {
                $deepest_depth = $current_term_depth;
                $deepest_term = $term;
            }
        }

        // work on deepest term
        if ( $deepest_term ) {

            // Get ancestors if any and add them to breadcrumbs items
            $deepest_term_ancestors = get_ancestors( $deepest_term->term_id, $breadcrumbs_taxonomy );
            if ( $deepest_term_ancestors && ( 0 < count( $deepest_term_ancestors ) ) ) {
                $deepest_term_ancestors = array_reverse( $deepest_term_ancestors ); // reversing the array is important
                foreach ( $deepest_term_ancestors as $term_ancestor_id ) {
                    $ancestor_term = get_term_by( \'id\', $term_ancestor_id, $breadcrumbs_taxonomy );
                    $inspiry_breadcrumbs_items[] = array(
                        \'name\' => $ancestor_term->name,
                        \'url\' => get_term_link( $ancestor_term, $breadcrumbs_taxonomy ),
                        \'class\' => \'\'
                    );
                }
            }

            // add deepest term
            $inspiry_breadcrumbs_items[] = array(
                \'name\' => $deepest_term->name,
                \'url\' => get_term_link( $deepest_term, $breadcrumbs_taxonomy ),
                \'class\' => \'\'
            );

        }

    endif;
我希望这会有帮助。

SO网友:Ralf912

我在StackOverflow上找到了一些返回最深子类别的代码,但不是从特定类别返回的

因此,您缺少的是指定一个类别。你为什么不做呢?这很简单

$catID = get_cat_ID( \'Sports\' );
$categories = get_the_category( $catID );
if ( $categories ) {
    $deepChild = get_deep_child_category( $categories );
    ?>
        <a href="<?php echo get_category_link( $deepChild->term_id ); ?>" title="<?php echo sprintf( __( "View all posts in %s" ), $deepChild->name ); ?>"><?php echo $deepChild->name; ?></a>
    <?php 
}

function get_deep_child_category( $categories )
{
    $maxId = 0;
    $maxKey = 0;
    foreach ( $categories as $key => $value )
    {
        if ( $value->parent > $maxId )
        {
            $maxId = $value->term_id;
            $maxKey = $key;
        }
    }
    return $categories[$maxKey];
}

结束

相关推荐

如何从小部件管理面板内的Get_Categories()选择列表中排除类别

我有一个小部件,我需要添加一个类别选择列表。最终用户应该能够选择一个类别,我需要用小部件保存类别ID。我遇到了一个绊脚石,因为我无法使排除数组正常工作。被排除在外的猫仍会出现在下拉列表中。我做错了什么?function form( $instance ) { $instance = wp_parse_args( (array) $instance, array( \'title\' => \'\', \'text\' => \'\', \'hide_title\' =>