При всей сумбурности заголовка, задача встречается очень часто. Для наглядности попробуем разобрать ее на рабочем примере. Но сначала вспомним, каким образом обычно выводится количество терминов таксономии.
$term = get_term( $tag_ID ); echo $term->count;
Берем ID термина (элемента таксономии) и с помощью функции get_term() запрашиваем массив, в котором содержится нужное нам значение [count]. Кстати, помимо него в массиве содержатся много других полезных данных: term_id, name, slug, term_group, term_taxonomy_id, taxonomy, description, parent и filter. В пояснениях они не нуждаются, наверное.
Итак, наша задача
Имеется три типа данных: нативные «Записи», кастомные «Книги» и «Журналы». В качестве общей таксономии все они имеют единый рубрикатор. Если где-то в шаблоне нужно будет вывести количество записей рубрики любого из имеющихся типов данных, они будут считаться для всех трех типов. А не для запрашиваемого, как предполагается. То есть если в каждом типе записи по 10 записей имеют рубрику «Сказки», Вордпресс посчитает, что термин «Сказки» встречается 30 раз.
Но подсчет количества чаще всего требуется в контексте одного типа данных. Например, в разделе «Книги» нужно вывести количество книг, а не постов или журналов, связанных с рубрикой.
В таких случаях я пользуюсь небольшой кастомной функцией get_term_post_count_by_type(), которая когда-то давно попалась мне на Стеке.
// Считать термины в типе данных function get_term_post_count_by_type($term,$taxonomy,$type){ $args = array( 'fields' =>'ids', 'posts_per_page' => -1, 'post_type' => $type, 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term ) ) ); $ps = get_posts( $args ); if (count($ps) > 0){ return count($ps); } else { return 0; } }
Функции в Вордпресс лучше размещать в файле functions.php активной темы, а еще лучше в специальном функциональном плагине, который не пропадет в случае смены темы.
В итоге решение задачи сводится к вызову функции
$booksCount = get_term_post_count_by_type('fantasy','category','books');
Запрашиваем количество записей в рубрике «Сказки» (fantasy) в типе данных «Книги» (books). И вернется их теперь не 30, а 10.
-
Спасибо, помогло, только в моем случае нужно было считать зависимость таксономии от другой таксономии, но пример рабочий. Единственное, не понял, зачем нужна проверка if (count($ps) > 0), можно же сразу return count( $ps );
-
спасибо помогло