Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I have a custom taxonomy (hierarchical) for which I'm outputting the results. For example's purpose:

--Drinks

----Tequila

------Reposado

------Blanco

----Beer & Wine

------Beer

------Wine

--------Red

--------White

--------Rose

----Whisky

------Lowlands

------Highlands

------Islay

I have a loop that goes through and outputs the hierarchy--the problem is that I have ONE term that goes a level deeper than the rest (the different types of wine: red, white, rose). Currently, my loop outputs headings for each term, so the loop puts Red, White, Rose at the same level as the rest of the terms. What I need it to do is realize when a term is 3-levels deep, and instead output an so that I can maintain the correct hierarchy.

All that to say: is there a way to determine a term's depth? if $term_depth = 4, then do this. If $term_depth = 4, then do this?

My loop:

$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>';       
}

Thanks for you time--if anyone is interested, I can send a link to the dev server so you can see how the Beer & Wine page outputs now, if this is unclear.

share|improve this question
add comment

1 Answer

Use get_ancestors() and count the returned array: that’s the number of ancestors a term has.

/**
 * 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;
}

For a practical use case you may take a look at my plugin T5 Parent Terms in body_class. Its name should tell you what it does. :)

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.