Считаем количество терминов в таксономии для каждого типа данных в Вордпресс

Связать одной таксономией несколько типов данных — частая и вполне типовая для Вордпресс задача. Но есть там один маленький, но неприятный баг (или не баг?), связанный с подсчетом количества записей. Покажу, как это решается.

При всей сумбурности заголовка, задача встречается очень часто. Для наглядности попробуем разобрать ее на рабочем примере. Но сначала вспомним, каким образом обычно выводится количество терминов таксономии.

$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.

Иван Данилин
Автор Иван Данилин

Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.

Комментарии
  1. Спасибо, помогло, только в моем случае нужно было считать зависимость таксономии от другой таксономии, но пример рабочий. Единственное, не понял, зачем нужна проверка if (count($ps) > 0), можно же сразу return count( $ps );
Добавить комментарий