Подсчет записей в произвольной таксономии
Есть ли способ подсчитать все опубликованные записи из произвольной таксономии?
В процессе поиска я нашел этот сниппет, но не смог заставить его работать...
global $wpdb;
$query = "
SELECT COUNT( DISTINCT cat_posts.ID ) AS post_count
FROM wp_term_taxonomy AS cat_term_taxonomy INNER JOIN wp_terms AS cat_terms ON
cat_term_taxonomy.term_id = cat_terms.term_id
INNER JOIN wp_term_relationships AS cat_term_relationships
ON cat_term_taxonomy.term_taxonomy_id = cat_term_relationships.term_taxonomy_id
INNER JOIN wp_posts AS cat_posts
ON cat_term_relationships.object_id = cat_posts.ID
WHERE cat_posts.post_status = 'publish'
AND cat_posts.post_type = 'post'
AND cat_term_taxonomy.taxonomy = 'YOUR-CUSTOM-TAXONOMY'
AND cat_terms.slug IN ('TERM-SLUG-1, TERM-SLUG-2')
";
return $wpdb->get_var($query);

Используйте экземпляр класса WP_Query для запроса к базе данных. http://codex.wordpress.org/Class_Reference/WP_Query
Для запроса пользовательских таксономий используйте:
$query = new WP_Query( array( 'people' => 'bob' ) );
Подробнее о доступных параметрах см.: Параметры таксономий http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
Получить опубликованные записи можно с помощью:
'post_status' => 'publish'
Используйте found_posts
для получения количества записей:
$count = $query->found_posts;

@amarinediary в данном случае вам на самом деле не нужно сбрасывать post data. Это требуется только если вы перебираете записи с помощью $query->the_post();
, что перезаписывает глобальный объект $post
в цикле. Если вы просто получаете количество записей, сброс post data - это лишние вычисления.

function wp_get_productcat_postcount($id) {
//возвращает количество постов
$args = array(
'post_type' => 'product', //тип записи, используется 'product'
'post_status' => 'publish', // только опубликованные записи
'posts_per_page' => -1, //показать все
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat', //название таксономии, здесь 'product_cat'
'field' => 'id',
'terms' => array( $id )
)
)
);
$query = new WP_Query( $args);
/*
echo '<pre>';
print_r($query->post_count);
echo '</pre>';
*/
return (int)$query->post_count;
}

Мне очень нравится простота ответа Varsha Dhadge, но он касается таксономий, прикрепленных к определенной записи. Для всего сайта лучше использовать get_terms
аналогичным образом:
$custom_cats = get_terms(
'custom_cat', // слаг вашей пользовательской таксономии
array(
// получаем все элементы, даже пустые, чтобы видеть, у каких 0 записей
'hide_empty' => false,
)
);
foreach ( $custom_cats as $term ) {
echo $term->slug . ' - ' . $term->count . '<br>';
}

это получает только термины, прикрепленные к $post->ID
. смотрите мое решение с использованием get_terms
вместо этого.

Обратите внимание, что $term->count
все равно дает вам общее количество записей, использующих этот термин на всем сайте - но вы получите только термины, прикрепленные к текущей записи. Возможно, это то, что ищут здесь некоторые люди, но если вам нужны все термины на всем сайте - что и является вопросом автора - вам нужен get_terms
.

WordPress добавляет атрибут count к каждой таксономии и обновляет его при добавлении или обновлении новой записи. Это позволяет избежать повторных обращений к базе данных и расчетов для получения количества записей в таксономии.
echo $custom_tax_obj->count;

Я столкнулся с такой ситуацией в шаблонах архивов таксономий (например, taxonomy-taxname.php
) для сайта с пользовательским типом записей и связанными таксономиями категорий/меток. Мне нужно было в заголовке отображать количество элементов, использующих эту таксономию.
В моих шаблонах архивов таксономий мне нужно было найти термин, который представляет таксономия, а затем передать его в функцию, чтобы получить количество элементов пользовательского типа записей, использующих этот термин, в данном случае из таксономии меток:
// получаем нужный термин для этой таксономии
$term_obj = get_queried_object();
// получаем объект термина
$term = get_term( $term_obj->term_id, 'taxname' );
// получаем количество материалов с этим термином
$tax_count = get_tax_count('taxname', $term->slug, 'custom-post-type-name');
// учитываем правильное склонение
$plural = ( $tax_count == 1) ? '' : 'ы';
echo $tax_count . ' Материал' . $plural . ' с меткой "' . $term->name . '"';
Функция для подсчета использует WP_Query с tax_query:
function tax_count ( $taxonomy, $term, $post_type ) {
// находим количество элементов пользовательского типа записей, использующих термин в таксономии
$args = array(
'post_type' => $post_type,
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $term,
),
),
);
$tax_query = new WP_Query( $args );
return ($tax_query->found_posts);
}

$args = array(
'post_type' => 'product', // тип записи - товар
'post_status' => 'published', // только опубликованные
'product_cat' => $catpage, // $catpage == slug категории товаров
'numberposts' => -1 // получать все товары без ограничения
);
echo $num = count( get_posts( $args ) ); // выводим количество найденных товаров

Я создал эту функцию для своих нужд, и она точно соответствует данному вопросу.
Получить количество записей в таксономии или вне ее
/**
* Получить количество записей/записей типа в указанной таксономии
*
* @param $post_type string любой тип записи
* @param $taxonomy string любая таксономия
* @param $is_exists string NOT EXISTS или EXISTS
*
* @return String Количество записей
*/
function prefix_get_post_count_in_taxonomy($post_type, $taxonomy, $is_exists = 'NOT EXISTS')
{
global $wpdb;
$count = $wpdb->get_var(
"
select COUNT(*) as post_count
FROM $wpdb->posts as A
WHERE $is_exists (
SELECT 1
FROM
$wpdb->term_relationships as B
INNER JOIN $wpdb->term_taxonomy as C
ON C.term_taxonomy_id = B.term_taxonomy_id
WHERE C.taxonomy = '$taxonomy'
AND B.object_id = A.ID
)
AND A.post_type = '$post_type'
"
);
return $count;
}
/**
* Пример использования
*
* Тип записи: download
* Таксономия: download_category
* Существует: EXISTS
*/
echo prefix_get_post_count_in_taxonomy('download', 'download_category', 'EXISTS');
