get_terms() не возвращает пустые термины, хотя hide_empty установлен как false

1 сент. 2014 г., 14:32:31
Просмотры: 23.8K
Голосов: 4

Я не могу заставить get_terms() возвращать пустые термины, хотя пробовал различные способы.

Вот код:

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

Я пробовал все возможные способы:

$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'))

Также пробовал последние два варианта без array. Ничего не работает. Функция возвращает все термины, которые имеют записи, но не возвращает пустые.

3
Комментарии

Вы пробовали использовать параметр 'get' => 'all'?

Tomás Cot Tomás Cot
1 сент. 2014 г. 15:05:37

Я нашел причину. Я использовал функцию get_terms() дважды и забыл об этом, поэтому не добавил параметр hide_empty во второй вызов функции.

Alex Dumitru Alex Dumitru
1 сент. 2014 г. 15:06:51

Хорошо, рад это слышать.

Tomás Cot Tomás Cot
1 сент. 2014 г. 15:08:16
Все ответы на вопрос 2
1
10

Вы используете аргумент hide_empty для $terms, но не для $this_term внутри вашего цикла.

Кроме того, учитывая способ генерации вашего select-элемента, было бы гораздо эффективнее просто запрашивать термины верхнего уровня для основного цикла:

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

И затем убрать условие if($term->parent == 0) {... внутри вашего цикла.

1 сент. 2014 г. 15:07:36
Комментарии

Да, так выглядит гораздо лучше. Я уже внес изменения. Спасибо!

Alex Dumitru Alex Dumitru
1 сент. 2014 г. 15:09:22
0

Я обнаружил проблему.

Я использую get_terms() дважды - один раз для родительских элементов и один раз для дочерних. Похоже, я не добавил параметр hide_empty=false в запрос для получения дочерних элементов.

1 сент. 2014 г. 15:05:02