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


При обновлении нашего портфолио я ищу что-то, что показывает количество сообщений в (текущей) категории типа сообщений.

Пример: У меня есть категория с "функциями". Каждая функция имеет свое собственное описание, страницы, связанные с приложениями и сообщениями, связанными с блогом

Я выбираю текущую категорию с помощью:

<?php $cat_id = get_query_var('cat'); ?>

И получать сообщения с:

 <?php query_posts("post_type=apps&cat=$cat_id&showposts=3");?>

Как можно подсчитать сообщения типа post_type=приложения и категории=$cat_id?

Мне очень жаль за отсутствие у меня опыта работы с PHP/WP.. кто-нибудь знает, как заставить эти 2 вещи работать?

Заранее благодарю.

Author: kaiser, 2013-07-03

4 answers

Публичный API для спасения

category это уже встроенная таксономия. Поэтому довольно легко подсчитать его срок с помощью get_terms( $tax, array( /* args */ ) );

$terms = get_terms( 'category', array(
    'fields' => 'count',
) );

Это позволит выполнить довольно быстрый запрос COUNT (*), так что вам не придется беспокоиться о производительности.

Альтернативное решение

Вы могли бы также просто выполнить обычный вызов get_terms(), а затем изменить selects с помощью фильтра:

// The core filter:
apply_filters( 'get_terms_fields', $selects, $args )

// Example callback:
add_action( 'get_terms_fields', 'wpse105174_get_terms_fields_cb', 10, 2 );
function wpse105174_get_terms_fields_cb( $selects, $args )
{
    return array( 't.term_id', 'COUNT(*)' );
}

...где $selects - массив aan (который будет разделен запятой разделенная строка).

Что делает его еще быстрее

Затем вы можете дополнительно изменить запрос и ограничить его только некоторыми конкретными категориями (терминами/таксонами) с помощью WHERE t.slug = whatever

// The core filter:
apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args );

// Example callback:
add_action( 'terms_clauses', 'wpse105174_terms_clauses_cb', 10, 3 );
function wpse105174_terms_clauses_cb( $pieces, $taxonomies, $args )
{
    $pieces['where'] = " WHERE t.slug = whatever";
    // Or do some `str_replace`, `preg_replace`, whatever fits in here

    return $pieces;
}

Вы также можете установить $pieces['join'] = '';, если вам не нужен доступ к таблице term_taxonomy.

Кэшируйте его

Наконец, вы можете использовать API переходных процессов для сохранения результатов (в виде сериализованного массива) в БД, поэтому вам не нужно запрашивать счетчик каждый раз, когда вам это нужно.

 9
Author: kaiser, 2013-07-03 12:08:01

Количество сообщений кэшируется в объекте категории для подобных вещей. В категории архивировать что-то вроде этого должно быть проще всего:

$category = get_queried_object();
// $category->count has count

Если вы пытаетесь получить все сообщения в категории с помощью этого цикла, вам следует использовать posts_per_page=-1, -1 для всех и posts_per_page является более новой заменой для showposts.

Для создания ссылок на архив категорий вы можете использовать get_category_link() функция.

 2
Author: Rarst, 2013-07-03 11:53:48

Вначале были некоторые проблемы, но это работает для меня:

<?php $posts = get_posts("post_type=apps&cat=$cat_id"); 
$count = count($posts); 
 echo "$count"; 
?>
 1
Author: rwzdoorn, 2013-07-03 12:39:57

У вас может быть количество записей из переменной $post после query_posts как

query_posts("post_type=apps&cat=$cat_id&showposts=3");
echo $post->post_count;

Вы находитесь на странице категории, я полагаю, так как вы получаете идентификатор категории от get_query_var("кошка"). Итак, чего вы на самом деле хотите больше, чем за три поста? вы можете это объяснить?

 -1
Author: Md Toufiqul Islam, 2013-07-03 11:50:41