Аргумент count в get_terms не влияет на вывод/не работает.

Вопрос или проблема

Я пытаюсь получить количество категорий, которые являются подкатегориями категории с идентификатором $categoryId.

В документации по объекту запроса термов, который является основным аргументом для get_terms, указан параметр count с описанием:

(bool) Возвращать ли количество термов (true) или массив объектов термов (false). Будет иметь приоритет над $fields, если true. По умолчанию false.

Исходя из этого, я думаю, что следующий код должен возвращать целое число, представляющее количество термов. Однако этого не происходит, он возвращает массив объектов термов, так же как если бы я не включал аргумент count. Я пробовал это с значениями 1, “true”, “True” и True.

get_terms(
    array(
        'parent' => $categoryId,
        'taxonomy' => 'category',
        'count' => true
    )
);

После дальнейшего поиска я нашел этот код, который работает:

wp_count_terms( 'category', array( 'parent' => $categoryId ) );

Почему аргумент count не оказывает никакого эффекта в этой ситуации? Это поведение последовательное?

Не уверен, с какой версии, но аргумент count больше не используется.
Я только что проверил класс WP_Term_Query и ничего не нашел, связанного с аргументом count в методе get_terms(), но вы все еще можете найти его в конструкторе этого класса.
Чтобы вернуть только количество термов, вам нужно установить count для аргумента fields.

get_terms(
    array(
        'parent' => $categoryId,
        'taxonomy' => 'category',
        'fields' => 'count'
    )
);

Функция wp_count_terms() делает то же самое.

function wp_count_terms( $taxonomy, $args = array() ) {
    $defaults = array('hide_empty' => false);
    $args = wp_parse_args($args, $defaults);

    if ( isset($args['ignore_empty']) ) {
        $args['hide_empty'] = $args['ignore_empty'];
        unset($args['ignore_empty']);
    }

    //ЗДЕСЬ УСТАНАВЛИВАЕТСЯ ЗНАЧЕНИЕ COUNT ДЛЯ ВАС
    $args['fields'] = 'count';

    return get_terms($taxonomy, $args);
}

Я не в первый раз замечаю, что англоязычная версия кодекса устарела. Например, испанская версия кодекса не имеет аргумента ‘count’ – https://codex.wordpress.org/es:Function_Reference/get_terms

Ответ или решение

Вопрос о том, почему аргумент count в функции get_terms не оказывает влияния на вывод и не работает как ожидается, вызывает интерес среди разработчиков WordPress. Давайте рассмотрим эту проблему подробнее.

Причина проблемы

На первый взгляд в документации WordPress действительно указано, что аргумент count позволяет определить, возвращать ли количество терминов (true) или массив объектов терминов (false). Однако, при использовании следующего кода:

get_terms(
    array(
        'parent' => $categoryId,
        'taxonomy' => 'category',
        'count' => true
    )
);

вы получаете массив объектов терминов, даже когда аргумент count установлен в true. Причина заключается в том, что фактическая реализация метода get_terms не учитывает этот параметр для возврата количества терминов, если вы хотите получить их счет.

Альтернативный подход

Суть проблемы заключается в том, что аргумент count больше не имеет эффекта в методе get_terms, и его использование не приводит к ожидаемому результату. Наиболее эффективный способ получить количество терминов — это использовать функцию wp_count_terms:

wp_count_terms('category', array('parent' => $categoryId));

Эта функция, как вам может показаться, делает то же самое, что и предыдущая, но она устанавливает параметр fields в 'count', что позволяет правильно возвращать количество терминов.

Вот как это происходит в исходном коде wp_count_terms:

function wp_count_terms($taxonomy, $args = array()) {
    $defaults = array('hide_empty' => false);
    $args = wp_parse_args($args, $defaults);

    if (isset($args['ignore_empty'])) {
        $args['hide_empty'] = $args['ignore_empty'];
        unset($args['ignore_empty']);
    }

    // Установим значение 'fields' в 'count'
    $args['fields'] = 'count';

    return get_terms($taxonomy, $args);
}

Как видно, wp_count_terms фактически устанавливает необходимое значение для fields, что позволяет корректно выводить количество категорий.

Заключение

Таким образом, если вам нужно получить количество подкатегорий для конкретной категории, используйте функцию wp_count_terms, вместо попыток использовать count в get_terms. Данные о том, что функциональность count устарела, а также отсутствие соответствующей документации в различных версиях справки о WordPress подчеркивают необходимость быть внимательным к версиям документации и изменениям в API.

Если вы столкнулись с несоответствием в документации WordPress, это может быть связано с тем, что некоторые данные не были обновлены в других языковых версиях. Рекомендуем всегда проверять последние изменения в официальной документации WordPress, чтобы оставаться в курсе обновлений и улучшений.

Оцените материал
Добавить комментарий

Капча загружается...