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' => ?
    );

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.


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 ..;)


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' );

    }

}

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.


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


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;
}

2
Você deve adicionar contexto para explicar seu código, sua idéia para resolver a questão.
— bueltge
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.