确定Term是否有祖父母/曾祖父母

时间:2012-07-05 作者:user17860

我有一个自定义的分类法(层次),我正在输出结果。例如,目的:

--饮料

----龙舌兰酒

------Reposado公司

------布兰科

----啤酒和;葡萄酒

------啤酒

------葡萄酒

--------红色

--------白色

--------罗斯

----威士忌

------低地

------高地

------Islay岛

我有一个循环来遍历并输出层次结构——问题是我有一个术语比其他术语(不同类型的葡萄酒:红、白、玫瑰)更深入。目前,我的循环输出每个术语的标题,因此循环将红色、白色和玫瑰色放在与其余术语相同的级别。我需要它做的是意识到一个术语的深度是3级的,然后输出一个,这样我就可以保持正确的层次结构。

所有这些都表明:有没有办法确定一个术语的深度?如果$term\\u depth=4,则执行此操作。如果$term\\u depth=4,那么是否执行此操作?

我的循环:

$theCatId = get_term_by( \'slug\', $currentslug, \'drink_cats\' );
$termID = $theCatId->term_id;
$taxonomyName = \'drink_cats\';
$termchildren = get_term_children( $termID, $taxonomyName );
$termhier = _get_term_hierarchy($taxonomyName);

if (isset($termhier[$termID])) {                
    foreach ($termchildren as $child) {
        $term = get_term_by( \'id\', $child, $taxonomyName );
        $termname = $term->name;
        // loop here to get $term depth?
        // level 3
        echo \'<h2>\'. $termname . \'</h2>\';
        // level 4 <h3>greatgrandchild</h3>
        $args = array(
            \'post_type\' => \'menu_drinks\',
            \'orderby\' => \'menu_order\',
            \'order\' => \'ASC\',
            \'posts_per_page\' => -1,
            \'taxonomy\'  => \'drink_cats\',
            \'term\'      => $term->slug
        );
        $drink_query = get_posts( $args );
        if ($drink_query) {
            echo \'<ul class="drink-group">\';
            foreach( $drink_query as $post ) {   
                setup_postdata($post); 
                $drinkdesc = get_field(\'drink_description\');
                $drinkprice = get_field(\'drink_price\');
                $drinkphoto = get_field(\'drink_photo\');
                //output specific drink, description, price
                ?>

                <li>
                    <h4><?php the_title(); if ($drinkprice) { echo " - $" . $drinkprice; } ?></h4>
                    <?php if ($drinkdesc) { ?>
                        <p><?php echo $drinkdesc; ?></p>
                    <?php }?>                                
                </li>

                <?php }
        echo \'</ul>\';
        }
    }
}

else { 
    $args = array(
        \'post_type\' => \'menu_drinks\',
        \'orderby\' => \'menu_order\',
        \'order\' => \'ASC\',
        \'posts_per_page\' => -1,
        \'taxonomy\'  => \'drink_cats\',
            \'term\' => $currentpage
    );

    $drink_query = get_posts( $args );
    echo \'<ul class="drink-group">\';
        foreach( $drink_query as $post ) :   
            setup_postdata($post); 
            $drinkdesc = get_field(\'drink_description\');
            $drinkprice = get_field(\'drink_price\');
            $drinkphoto = get_field(\'drink_photo\');
        ?>

                    <li>
                            <h4><?php the_title(); if ($drinkprice) { echo " - $" . $drinkprice; } ?></h4>
                            <?php if ($drinkdesc) { ?>
                <p><?php echo $drinkdesc; ?></p>
            <?php } ?>                                
                    </li>

        <?php endforeach; 
    echo \'</ul>\';       
}
感谢您的时间——如果有人感兴趣,我可以发送一个到开发服务器的链接,这样您就可以看到啤酒和;如果不清楚的话,葡萄酒页面现在输出。

1 个回复
SO网友:fuxia

使用get_ancestors() 并计算返回的数组:这是一个术语的祖先数。

/**
 * Count a term’s ancestors.
 *
 * @param  int    $term_id
 * @param  string $taxonomy
 * @return int
 */
function wpse_57512_count_ancestors( $term_id = FALSE, $taxonomy = FALSE )
{
    if ( FALSE === $term_id and ! empty ( get_queried_object()->taxonomy ) )
    {
        $term_id  = get_queried_object_id();
        $taxonomy = get_queried_object()->taxonomy;
    }

    $ancestors = get_ancestors( $term_id, $taxonomy );

    return $ancestors ? count( $ancestors ) : 0;
}
对于一个实际的用例,你可以看看我的插件T5 Parent Terms in body_class. 它的名字应该告诉你它是做什么的。:)

结束