posts_per_page sem limite

41

Quero retornar TODAS as postagens com query_posts. Tentei definir posts_per_pageum número realmente alto, mas query_postsenlouquece e não retorna nenhuma postagem. Qual é a maneira correta de consultar postagens sem limite?

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => ?
    );
Banjer
fonte
6
Estou pesquisando no Google há algum tempo e pesquisando no códice WP, mas não consigo encontrar uma resposta direta a essa pergunta simples. Acredito que minha pergunta esteja claramente escrita com código de exemplo e qual foi minha tentativa (definir um valor alto para o argumento). Eu não sou um especialista em WP, por isso vim aqui para fazer a pergunta. Mesmo fornecendo respostas para perguntas que parecem triviais para você, é útil para o crescimento dessas comunidades do Stack Exchange. Pessoalmente, adoro ver um link Stack Overflow nos meus resultados de pesquisa, em vez de um link para um fórum ruim.
Banjer
Além disso, obrigado pela resposta. Você deve publicá-lo como resposta e não como comentário, para que eu possa aceitá-lo.
Banjer
Entendi seu ponto e agradeço seu esforço em escrever a pergunta. Também concordo que perguntas de não especialistas podem ser valiosas nessa comunidade. Por outro lado, muitas dessas perguntas podem desencorajar alguns especialistas de se envolverem aqui. É tudo sobre algum tipo de equilíbrio, eu acho. De qualquer forma, sou um grande eleitor, por isso estou ansioso pelas suas próximas perguntas :) Divirta-se aqui no WPSE.
Michal Mau
PS: você também deseja substituir typepara post_type(ou remover esta linha completamente). Editarei a resposta de Rutwick e sua pergunta para impedir que alguém copie e cole esse pequeno erro.
Michal Mau
@ Maugly Obrigado pela correção homem ... apenas focado em posts_per_page, portanto, copiou o erro de digitação! ;)
Rutwick Gangurde

Respostas:

83

-1 é a sua resposta! Procure posts_per_page aqui .

$args = array(
'post_type'      => 'post',
'cat'            => '22,47,67',
'orderby'        => 'name',
'order'          => 'ASC',
'hide_empty'     => 1,
'depth'          => 1,
'posts_per_page' => -1
);

Advertência importante : isso pode resultar em uma consulta muito grande que pode derrubar o site. Faça isso apenas se tiver certeza de que seu banco de dados pode lidar com isso. Não em temas públicos ou plugins.

Rutwick Gangurde
fonte
6
Advertência importante: isso pode resultar em uma consulta muito grande que pode derrubar o site. Faça isso apenas se tiver certeza de que seu banco de dados pode lidar com isso. Não em temas públicos ou plugins.
fuxia
@toscho Adicionando seu comentário como uma atualização para a resposta.
Rutwick Gangurde
você salva minha vida !!
Darlan Dieterich
@DarlanDieterich Fico feliz em poder ajudar! :)
Rutwick Gangurde 14/10
24

Ou, alternativamente, você pode passar WP_Query(que é o que query_postsusa) o nopagingargumento, que basicamente faz a mesma coisa.

$args = array(
    'nopaging' => true
    // Your other args, etc..
);

Ele fará exatamente o mesmo, mas se você tiver que olhar para trás mais tarde e não se lembrar do que estava fazendo, eu pessoalmente acho que ficará mais claro para você, o que você estava pretendendo com esse parâmetro dentro dos argumentos array.

Como eu mencionei no entanto, os dois realmente alcançarão o mesmo.

Não pode machucar ter mais de uma abordagem, e sempre é bom compartilhar o que você sabe, basta dizer que essa é a razão da minha resposta, apesar de você já ter uma abordagem suficiente ..;)

t31os
fonte
4

No arquivo de funções dos temas filhos:

add_action( 'pre_get_posts', 'wpsites_no_limit_posts' );

function wpsites_no_limit_posts( $query ) {

if( $query->is_main_query() && !is_admin() && is_home() ) {

$query->set( 'posts_per_page', '-1' );
$query->set( 'order', 'ASC' );
$query->set( 'post_type', 'post' );
$query->set( 'cat', '22,47,67' );
$query->set( 'orderby', 'name' );
$query->set( 'order', 'ASC' );
$query->set( 'hide_empty', '1' );
$query->set( 'depth', '1' );

    }

}
Brad Dalton
fonte
2

Usando o Ricardo com algumas modificações:

static $paged;
$post_ids = [];
do {
    $paged++;
    $defaults = [
        'fields' => 'ids', // Only return the ID field to make this query faster.
        'post_type' => 'post',
        'posts_per_page' => 100,
        'no_found_rows' => false, // We need pagination & the count for all posts found.
        'paged' => $paged,
        'update_post_term_cache' => false,
        'update_post_meta_cache' => false,
    ];
    $query = new WP_Query($defaults);
    if ($query->have_posts()) {
        foreach ($query->posts as $id) {
            $post_ids[] = $id;
        }
    }
} while ($query->max_num_pages > $paged);

return $post_ids;

Isso aumentará drasticamente o tempo de consulta consultando apenas a linha de ID e evitando a atualização do termo e do meta cache.

Austin Passy
fonte
Agradável! obrigado por compartilhar.
Ricardo Canelas
1

A resposta certa para o seu problema é 'posts_per_page' => -1porque -1retornará postagens ilimitadas por página, à medida que os outros usuários responderem.

Eu só quero adicionar um complemento para este Q / A,

Se você deseja obter o número de postagens por página na configuração de leitura no Painel de Administração do WordPress, é necessário chamar a get_option()função e passar posts_per_pagecomo uma string para ela.

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => get_option('posts_per_page')
    );

Espero que esta resposta ajude alguém, pois me ajuda. Usuários felizes de Stackexchange de codificação

Elkhouaja
fonte
Isso é realmente uma boa adição!
Herbert Van-Vliet
1

Ou..

function getAll($arg, $posts_per_page = 50)
{
    $data = array();
    $page = 1;

    do{
        $arg['paged'] = $page;
        $arg['posts_per_page'] = $posts_per_page;

        $query = new WP_Query($arg);

        foreach ($query->posts as $post){
            $data[] = $post;
        }

        $page++;

    }while(count($query->posts) === $posts_per_page);

    return $data;
}
Ricardo Canelas
fonte
2
Você deve adicionar contexto para explicar seu código, sua idéia para resolver a questão.
bueltge