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

25

Pesquisei no Google e no WPSE e a única coisa que vejo repetidamente é o uso showposts, que foi preterido.

Estou familiarizado com WP_Query, e eu pensei que se eu definir posts_per_pagea minha limite (ie. 5), e nopagingpara true, que se tornaria a algo como " Ok, eu vou dar-lhe apenas 5 mensagens ". Mas isso não funciona.

insira a descrição da imagem aqui

Como posso fazer isso?

EliasNS
fonte
Apenas'posts_per_page=5'
Pieter Goosen
Eu uso isso, mas encontrei todas as postagens. Se eu acessar a found_postspropriedade, ele indica um número maior que 5. Quero que minha consulta mantenha apenas 5 postagens. É possível? @PieterGoosen
EliasNS
Você não deve definir o nopagingparâmetro, definindo que para os verdadeiros meios para obter todas as mensagens
Pieter Goosen
@PieterGoosen Se eu não definir o nopagingparâmetro, ele obtém o padrão false, portanto, o frontpage mostra 5 postagens, mas a consulta mantém mais. Eu adiciono uma imagem à pergunta.
EliasNS 18/03/2015
Seus comentários são confusos, você pediu para limitar a quantidade de postagens mostradas em uma página para 5, é isso que você recebe. Agora, você diz (releia seu comentário anterior :-)) que a consulta contém mais. Por favor explique. Você não pode definir posts_per_page e, em seguida, usar set no_paging para true na mesma consulta, ou é posts_per_page OU conjunto nopaging a verdade
Pieter Goosen

Respostas:

43

Eu acho que agora eu entendo o que você está tentando fazer. Quando você executa uma consulta personalizada WP_Querye define o limite para obter apenas 5 postagens por página, apenas 5 postagens serão recuperadas pela consulta e essa consulta retém apenas 5 postagens, MAS , por uma questão de paginação, WP_Queryainda é executada em todo o banco de dados e conta todas as postagens que correspondem aos critérios da consulta.

Isso pode ser visto quando você olha para as propriedades $found_postse $max_num_pagesda consulta. Vamos dar um exemplo:

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

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) fornecerá as últimas 5 postagens conforme o esperado
  • echo $q->found_posts Darei à você 20
  • echo $q->max_num_pages Darei à você 4

O impacto desse trabalho extra é mínimo em sites com apenas algumas postagens, mas isso pode custar caro se você estiver executando um site com centenas ou milhares de postagens. Isso é um desperdício de recursos, se você precisar apenas das 5 últimas postagens

Existe um parâmetro não documentado chamado no_found_rowsque usa valores booleanos que você pode usar para fazer sua consulta ser resgatada após encontrar as 5 postagens necessárias. Isso forçará a WP_Querynão procurar mais postagens que atendam aos critérios depois de recuperar a quantidade de postagens consultadas. Esse parâmetro já está incorporado get_posts, por isso get_postsé um pouco mais rápido do WP_Queryque o get_postsuso deWP_Query

Conclusão

Em conclusão, se você não usar a paginação em uma consulta, é sempre aconselhável 'no_found_rows=true'em sua consulta acelerar as coisas e economizar em desperdiçar recursos.

Pieter Goosen
fonte
3

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_postsestava me confundindo. Eu acho que esse número são os posts recuperados, mas não o são. É o número de postagens que correspondem aos critérios . É como as WP_Queryduas partes: uma para encontrar (todas) as postagens e outra para buscar o conteúdo, quando verifica os paginationparâmetros. Portanto, temos a $post_countpropriedade que é o número de postagens buscadas (diz o Codex The number of posts being displayed), que obviamente é igual ao número no posts_per_pageparâmetro e o número de itens na $postspropriedade da matriz.

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

Espero que isso ajude os outros!

EliasNS
fonte
Veja minha resposta. Eu acho que entendo o que quer dizer :-)
Pieter Goosen
Sim! Você fez muito bem: D Finalmente, consegui fazer isso e entendo tudo = D Obrigado @PieterGoosen!
EliasNS 19/03/2015
Feito! Ele estendeu minha própria resposta ^^ @PieterGoosen
EliasNS
1

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 postagem personalizada, substitua-a assim 'post_type' => 'posts',se você deseja buscar todas as postagens e substitua-a assim 'posts_per_page' => '-1',, para obter mais detalhes WP Query

shuvroMithun
fonte
Veja os comentários sobre a questão, por favor.
EliasNS 18/03/2015
1

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
Shreyo Gi
fonte
idé inválido como um orderbyvalor e paginationé um parâmetro inválido
Pieter Goosen
paginationnão é um parâmetro válido. Você quer dizer 'nopaging' => true? Se sim, receberei TODAS as postagens. Não é isso que eu quero. @PieterGoosen Acho que ele quis dizer ID.
EliasNS 18/03/2015
orderby é para exibir o pedido, certo? Não prejudica o valor / parâmetro do nopaging. @PieterGoosen Por que ID e orderby são inválidos? Você pode esclarecer o ponto?
Shreyo Gi 18/03/2015
Deve ser ID, nãoid
Pieter Goosen