web-dev-qa-db-fra.com

get_terms () ne renvoie pas de termes vides même si hide_empty est false

Je n'arrive pas à faire get_terms() pour renvoyer les termes vides et je l'ai essayé de plusieurs façons.

Voici le code:

$terms = get_terms('device',array('hide_empty' => 0));
foreach($terms as $term) {
        if($term->parent == 0) {
            if($i++ != 0) echo '</optgroup>'; echo '<optgroup label="'.$term->name.'">';
            $id = $term->term_id;
            $args = array("child_of"=>$id);
            $this_term = get_terms('device',$args);
            foreach($this_term as $the_term) { 
                $term_name = str_replace($term->name,'',$the_term->name);
                echo '<option value="'.$the_term->term_id.'">'.$the_term->name.'</option>';
            }
        }
    }

J'ai essayé tous les moyens possibles:

$terms = get_terms('device',array('hide_empty' => false))
$terms = get_terms('device',array('hide_empty' => 0))
$terms = get_terms('device',array('hide_empty=false'))
$terms = get_terms('device',array('hide_empty=0'))

Également essayé les deux derniers moyens sans array. Rien ne semble fonctionner. Il retourne tous les termes qui ont des posts, mais aucun vide.

2
Alex Dumitru

Vous utilisez l'argument hide_empty pour $terms, mais pas pour $this_term dans votre boucle.

En outre, avec la manière dont vous générez votre sélection, il serait beaucoup plus efficace de simplement interroger les termes de niveau supérieur pour la boucle principale:

$terms = get_terms( 'device', array( 'hide_empty' => false, 'parent' => 0 ) );

Et puis déposez if($term->parent == 0) {... dans votre boucle.

6
TheDeadMedic

J'ai trouvé le problème.

J'utilise get_terms() deux fois, une fois pour les parents et une fois pour les enfants. Il semble que je n’ai pas ajouté hide_empty=false à celui qui contient les enfants.

0
Alex Dumitru