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

26 декабря 2019

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

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

$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
Иван Данилин

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

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