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

26 декабря 2019

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

Кворк 3

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

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

Подпишитесь на мой телеграм и первыми получайте новые материалы, в том числе которых нет на сайте.

INNERSTAT
Лучшее за неделю
Иван Данилин

Практикующий веб-разработчик, специализируюсь на платформе Вордпресс.

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