posts_per_page pas de limite


41

Je veux retourner TOUS les messages avec query_posts. J'ai essayé de définir posts_per_pageun nombre très élevé, mais je suis paniqué et je query_postsne renvoie aucun message. Quelle est la bonne façon d'interroger les publications sans limite?

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

6
Cela fait un moment que je suis sur Google et que je cherche dans le codex WP, mais je ne trouve pas de réponse directe à cette question simple. Je crois que ma question est formulée clairement avec un exemple de code et quelle a été ma tentative (attribuer une valeur élevée à l'argument). Je ne suis pas un expert de WP, c'est pourquoi je suis venu ici pour poser la question. Il est même utile de fournir des réponses aux questions qui vous semblent triviales pour développer ces communautés Stack Exchange. Personnellement, j'aime bien voir un lien de débordement de pile dans mes résultats de recherche, par opposition à un lien vers un forum de mauvaise qualité.
Banjer

Merci également pour la réponse. Vous devriez le poster comme réponse et non comme commentaire, pour que je puisse l'accepter.
Banjer

J'ai bien compris votre point de vue et j'apprécie vos efforts pour écrire la question. Je conviens également que les questions posées par des non-spécialistes peuvent s'avérer utiles dans cette communauté. D'autre part, trop de questions de ce type peuvent décourager certains experts de s'impliquer ici. Je suppose qu'il s'agit d'une sorte d'équilibre. Quoi qu'il en soit, je suis un grand électeur donc j'attends vos prochaines questions avec impatience :) Passez un bon moment ici sur WPSE.
Michal Mau

PS: vous souhaitez également remplacer typepar post_type(ou supprimer complètement cette ligne). Je vais modifier la réponse de Rutwick et votre question pour empêcher quelqu'un de copier-coller cette petite erreur.
Michal Mau

@Maugly Merci pour la correction homme ... juste concentré sur posts_per_page donc copié la faute de frappe! ;)
Rutwick Gangurde

Réponses:


83

-1 est votre réponse! Cherchez posts_per_page ici .

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

Mise en garde importante : Cela peut entraîner une très grosse requête pouvant entraîner la fermeture du site. Ne le faites que si vous êtes sûr que votre base de données peut le gérer. Pas dans les thèmes publics ou plugins.


6
Mise en garde importante: Cela peut entraîner une très grosse requête pouvant entraîner la fermeture du site. Ne le faites que si vous êtes sûr que votre base de données peut le gérer. Pas dans les thèmes publics ou plugins.
fuxia

@toscho Ajout de votre commentaire comme mise à jour de la réponse.
Rutwick Gangurde

tu me sauves la vie !!
Darlan Dieterich

@DarlanDieterich Heureux d'avoir pu vous aider! :)
Rutwick Gangurde

24

Ou bien vous pouvez passer WP_Query(ce qui est ce qui query_postsutilise) l’ nopagingargument, qui fait fondamentalement la même chose.

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

Cela fera exactement la même chose, mais si vous devez regarder en arrière plus tard et que vous ne vous souvenez pas de ce que vous faisiez, j’ai personnellement le sentiment que ce sera plus clair pour vous, ce que vous vouliez faire avec ce paramètre dans les arguments. tableau.

Comme je l'ai mentionné cependant, ils obtiendront tous les deux la même chose.

On ne peut pas nuire d'avoir plus d'une approche, et il est toujours agréable de partager ce que vous savez, il suffit de dire que c'est la raison de ma réponse, même si vous en avez déjà une suffisante ..;)


4

À partir de votre fichier de fonctions de thèmes enfants:

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

Utilisation de Ricardo avec quelques modifications:

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;

Cela augmentera considérablement le temps d'interrogation en interrogeant uniquement la ligne ID et en évitant la mise à jour du méta cache et des termes.


Agréable! Merci d'avoir partagé.
Ricardo Canelas

1

La bonne réponse à votre problème est 'posts_per_page' => -1parce que-1 qu’il renverra un nombre illimité de messages par page comme les autres utilisateurs répondent.

Je veux juste ajouter un add-on à cette Q / A,

Si vous souhaitez obtenir le nombre de publications par page à partir des paramètres de lecture du panneau d'administration de WordPress, vous devez appeler la get_option()fonction et lui transmettre posts_per_pageune chaîne.

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

J'espère que cette réponse aidera quelqu'un comme cela m'aide. Joyeux Codage Utilisateurs Stackexchange


C'est en fait une belle addition!
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
Vous devriez ajouter un contexte pour expliquer votre code, votre idée pour résoudre la question.
Bueltge
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.