Como limitar o número de postagens que WP_Query recebe?

19

Estou pesquisando no Google e WPSE e a única coisa que vejo repetidamente é usar showposts , que está obsoleto.

Estou familiarizado com WP_Query e achei que, se eu definir posts_per_page como meu limite (ou seja, 5) e nopaging a true , seria algo como " Ok , Vou te dar apenas 5 posts ". Mas isso não funciona.

Como posso fazer isso?

    
por EliasNS 18.03.2015 / 11:52
fonte

4 respostas

37

Acho que agora entendo o que você está tentando fazer. Quando você executa uma consulta personalizada com WP_Query e define o limite para obter apenas cinco postagens por página, apenas cinco postagens serão recuperadas pela consulta, e essa consulta terá apenas cinco postagens, MAS para o Por causa da paginação, WP_Query ainda é executado em todo o banco de dados e conta todas as postagens que correspondem aos critérios da consulta.

Isso pode ser visto quando você observa as propriedades $found_posts e $max_num_pages da consulta. Vamos dar um exemplo:

Você tem 20 postagens pertencentes ao tipo de postagem padrão post . Você precisa das últimas 5 postagens sem paginação. Sua consulta parece com isso

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) fornecerá as 5 postagens mais recentes conforme o esperado
  • echo $q->found_posts vai te dar 20
  • echo $q->max_num_pages vai te dar 4

O impacto deste trabalho extra é mínimo em sites com apenas alguns posts, mas isso pode custar caro se você estiver executando um site com centenas ou milhares de posts. Isso é um desperdício de recursos se você só vai precisar dos 5 últimos posts

Existe um parâmetro não documentado chamado no_found_rows , que usa valores booleanos que você pode usar para fazer sua consulta parar depois de encontrar os 5 posts que você precisa. Isso forçará WP_Query a não procurar mais mensagens para preencher os critérios depois de recuperar a quantidade de postagens consultadas. Esse parâmetro já está compilado em get_posts , é por isso que get_posts é um pouco mais rápido que WP_Query , embora get_posts use WP_Query

Em conclusão, se você não for usar a paginação em uma consulta, é sempre aconselhável 'no_found_rows=true' em sua consulta para acelerar as coisas e economizar no desperdício de recursos.

    
por Pieter Goosen 18.03.2015 / 13:22
fonte
2

Após a conversa com @Pieter Goosen sobre os comentários da pergunta, acho que posso responder à pergunta e explicar meu erro.

A chave é que found_posts estava me confundindo. Eu acho que, esse número é os posts recuperados, mas não é. É o número de postagens que correspondem aos critérios . É como se o WP_Query tivesse 2 partes: uma para localizar (todas) as postagens e outra para buscar o conteúdo, quando ele verifica os parâmetros pagination . Portanto, temos a propriedade $post_count que é o número de postagens buscadas (o Codex diz The number of posts being displayed ), que obviamente é igual ao número no parâmetro posts_per_page e o número de itens na propriedade $posts da matriz.

Então WP_Query não está fazendo nenhum trabalho inútil, como eu pensei ^^

Espero que isso ajude os outros!

    
por EliasNS 18.03.2015 / 13:16
fonte
2

Eu sei que @ user1750063 mencionou o código, mas tente isso

$args = array (
    'post_type'              => 'custom_post',
    'nopaging'               => false,
    'posts_per_page'         => '5',
    'order'                  => 'DESC',
    'orderby'                => 'ID',
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // display content
    }
} else {
    // display when no posts found
}

wp_reset_postdata();     // Restore original Post Data
    
por Shreyo Gi 18.03.2015 / 12:50
fonte
0

Ok, permite que você tenha um tipo de postagem chamado 'blog_posts' e deseja buscar 5 postagens desse tipo de postagem. Aqui está o que você precisa fazer

$args = array(
        'post_type' => 'blog_posts',
        'posts_per_page' => '5',
);


$query = new WP_Query($args);

A consulta acima retornará 5 postagens do tipo 'blog_posts', se não for um tipo de post personalizado, apenas substitua assim 'post_type' => 'posts', se você quiser buscar todas as postagens e então substitua assim 'posts_per_page' => '-1', , para mais detalhes WP Query

    
por shuvroMithun 18.03.2015 / 12:07
fonte