3

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.

1 Answer 1

3

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. :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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