Подсчитывайте записи, к которым прикреплен определенный термин таксономии
При обновлении нашего портфолио я ищу что-то, что показывает количество сообщений в (текущей) категории типа сообщений.
Пример: У меня есть категория с "функциями". Каждая функция имеет свое собственное описание, страницы, связанные с приложениями и сообщениями, связанными с блогом
Я выбираю текущую категорию с помощью:
<?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 вещи работать?
Заранее благодарю.
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 переходных процессов для сохранения результатов (в виде сериализованного массива) в БД, поэтому вам не нужно запрашивать счетчик каждый раз, когда вам это нужно.
Количество сообщений кэшируется в объекте категории для подобных вещей. В категории архивировать что-то вроде этого должно быть проще всего:
$category = get_queried_object();
// $category->count has count
Если вы пытаетесь получить все сообщения в категории с помощью этого цикла, вам следует использовать posts_per_page=-1
, -1
для всех и posts_per_page
является более новой заменой для showposts
.
Для создания ссылок на архив категорий вы можете использовать get_category_link()
функция.
Вначале были некоторые проблемы, но это работает для меня:
<?php $posts = get_posts("post_type=apps&cat=$cat_id");
$count = count($posts);
echo "$count";
?>
У вас может быть количество записей из переменной $post после query_posts как
query_posts("post_type=apps&cat=$cat_id&showposts=3");
echo $post->post_count;
Вы находитесь на странице категории, я полагаю, так как вы получаете идентификатор категории от get_query_var("кошка"). Итак, чего вы на самом деле хотите больше, чем за три поста? вы можете это объяснить?