Вопрос или проблема
Я пытаюсь получить количество категорий, которые являются подкатегориями категории с идентификатором $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, чтобы оставаться в курсе обновлений и улучшений.