Подсчет записей в произвольной таксономии

15 дек. 2012 г., 19:02:36
Просмотры: 47.9K
Голосов: 11

Есть ли способ подсчитать все опубликованные записи из произвольной таксономии?

В процессе поиска я нашел этот сниппет, но не смог заставить его работать...

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);
0
Все ответы на вопрос 10
2

Используйте экземпляр класса 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;
15 дек. 2012 г. 19:32:09
Комментарии

Не забудьте вызвать wp_reset_postdata().

amarinediary amarinediary
20 мар. 2021 г. 14:08:05

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

noahmason noahmason
28 февр. 2023 г. 21:34:33
0
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;

}
24 апр. 2013 г. 14:46:14
0

Мне очень нравится простота ответа 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>';
}
14 июл. 2020 г. 03:59:46
2

Код ниже получит количество записей из указанной таксономии

<?php 
  $terms = get_the_terms( $post->ID , 'your-taxonomy' );
  foreach ( $terms as $term ) {
    echo $term->count;
  } ?>
15 нояб. 2017 г. 14:29:48
Комментарии

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

squarecandy squarecandy
14 июл. 2020 г. 04:01:14

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

squarecandy squarecandy
14 июл. 2020 г. 04:07:50
1

Вы можете сделать это с текущим объектом, используя get_queried_object()

$posts = get_queried_object();
echo $posts->count;

Иначе вы можете понапрасну запустить второй запрос, верно?

18 авг. 2014 г. 22:40:43
Комментарии

Блестяще! :) Большое спасибо. Это работает, когда я нахожусь внутри категории. :)

Woppi Woppi
31 мая 2017 г. 12:50:08
0

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

echo $custom_tax_obj->count;
3 февр. 2014 г. 00:06:43
0

Я столкнулся с такой ситуацией в шаблонах архивов таксономий (например, 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);

}
20 сент. 2018 г. 08:19:18
1
-1
$args = array(
'post_type' => 'product', // тип записи - товар
'post_status' => 'published', // только опубликованные
'product_cat' => $catpage, // $catpage == slug категории товаров
'numberposts' => -1 // получать все товары без ограничения
);
echo $num = count( get_posts( $args ) ); // выводим количество найденных товаров
24 авг. 2016 г. 16:23:48
Комментарии

Пожалуйста, уделите минуту и объясните, что делает ваш код.

user9447 user9447
24 авг. 2016 г. 16:46:27
0
-1

Я создал эту функцию для своих нужд, и она точно соответствует данному вопросу.

Получить количество записей в таксономии или вне ее

/**
 * Получить количество записей/записей типа в указанной таксономии
 *
 * @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');
17 мая 2021 г. 12:33:41
0
-1

Этот метод я использовал, и он сработал для меня.

 $terms = get_terms([
    'taxonomy' => 'types',
    'hide_empty' => false,
]);
$taxonomies = [];

foreach($terms as $term){
    echo $term->name .'----->'.$term->count.'<br>';  //здесь выводятся количество записей.
}
1 дек. 2022 г. 15:06:06