Conte as postagens que possuem termo de taxonomia específico anexado

2

Ao atualizar nosso portfólio, estou procurando algo que mostre o número de postagens em uma categoria (atual) de um tipo de postagem.

Exemplo: tenho uma categoria com 'recursos'. Cada recurso tem sua própria descrição, aplicativos relacionados e páginas de posts relacionados a blogs

Estou buscando a categoria atual com:

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

e receba postagens com:

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

Como é possível contar as postagens de post_type = apps e category = $ cat_id?

Sinto muito pela minha falta de experiência em PHP / WP. Alguém sabe como fazer essas duas coisas funcionarem?

Obrigado antecipadamente.

    
por rwzdoorn 03.07.2013 / 13:40

4 respostas

8

API pública para o resgate

category é uma taxonomia já incorporada. Portanto, é muito fácil obter a contagem de termos com get_terms( $tax, array( /* args */ ) );

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

Isso gerará uma consulta COUNT (*) bastante rápida para que você não precise se preocupar com o desempenho.

Solução alternativa

Você também pode fazer uma chamada normal para get_terms() e depois alterar o selects com o filtro:

// 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(*)' );
}

... onde $selects é uma matriz (que será implodida em uma string separada por vírgula).

Tornando ainda mais rápido

Você pode modificar a consulta e restringi-la apenas a algumas categorias específicas (termos / táxons) com 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;
}

Você também pode definir o $pieces['join'] = ''; se não precisar acessar a term_taxonomy -table.

Cache

Por fim, você pode utilizar a API de transientes para salvar seus resultados (como matriz serializada) no banco de dados, para que você não o faça tem que consultar a contagem toda vez que você precisar.

    
por kaiser 03.07.2013 / 14:02
2

A contagem de postagens é armazenada em cache no objeto de categoria para coisas como essa. Na categoria archivve, algo assim deve ser mais fácil:

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

Se você estiver tentando recuperar todas as postagens na categoria por meio desse loop, deverá usar posts_per_page=-1 , -1 para todos e posts_per_page é a substituição mais recente para showposts .

Para criar links para o arquivo de categorias, você pode usar a função get_category_link() .

    
por Rarst 03.07.2013 / 13:53
1

Tive alguns problemas no começo, mas isso funciona para mim:

<?php $posts = get_posts("post_type=apps&cat=$cat_id"); 
$count = count($posts); 
 echo "$count"; 
?>
    
por rwzdoorn 03.07.2013 / 14:39
-1

Você pode ter a contagem de postagens da variável $ post após query_posts como

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

Você está em uma página de categoria, suponho, pois está obtendo o ID da categoria de get_query_var ('cat'). Então, o que você realmente quer para mais de três posts? você pode explicar isso?

    
por Md Toufiqul Islam 03.07.2013 / 13:50