web-dev-qa-db-fra.com

Déterminer si terme a un grand-parent/arrière-grand-parent

J'ai une taxonomie personnalisée (hiérarchique) pour laquelle je produis les résultats. Par exemple, le but:

- Boissons

----Tequila

------ Reposado

------ Blanco

----Bière vin

------Bière

------Du vin

--------Rouge

--------Blanc

--------Rose

----Whisky

------ Basses terres

------Hauts plateaux

------ Islay

J'ai une boucle qui traverse et sort la hiérarchie - le problème est que j'ai UN terme qui va un niveau plus profond que le reste (les différents types de vin: rouge, blanc, rose). Actuellement, ma boucle affiche les en-têtes pour chaque terme. La boucle place donc Red, White, Rose au même niveau que le reste des termes. Ce dont j'ai besoin, c'est de me rendre compte de la profondeur d'un terme sur 3 niveaux et de produire un résultat afin que je puisse maintenir la hiérarchie correcte.

Tout ça pour dire: existe-t-il un moyen de déterminer la profondeur d'un terme? si $ term_depth = 4, faites ceci. Si $ term_depth = 4, alors fais ceci?

Ma boucle:

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

Merci pour votre temps - si cela vous intéresse, je peux envoyer un lien au serveur de dev afin que vous puissiez voir comment la page Beer & Wine s'affiche maintenant, si cela n'est pas clair.

3
user17860

Utilisez get_ancestors() et comptez le tableau renvoyé: c’est le nombre d’ancêtres qu’un terme possède.

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

Pour un cas d'utilisation pratique, vous pouvez jeter un oeil à mon plugin Termes parents T5 dans body_class . Son nom devrait vous dire ce qu'il fait. :)

3
fuxia