Come limitare il numero di post che riceve WP_Query?


25

Ho fatto ricerche su Google e WPSE e l'unica cosa che vedo ripetutamente è l'uso showposts, che è deprecato.

Sono a conoscenza WP_Query, e ho pensato che se ho impostato posts_per_pageal mio limite (es. 5), e nopagingper true, sarebbe diventato a qualcosa come " Ok, ti darò solo 5 messaggi ". Ma questo non funziona.

inserisci qui la descrizione dell'immagine

Come posso fare questo?


Solo'posts_per_page=5'
Pieter Goosen il

Lo uso, ma quello ha trovato tutti i post. Se accedo alla found_postsproprietà, viene visualizzato un numero superiore a 5. Voglio che la mia query contenga solo 5 post. È possibile? @PieterGoosen
EliasNS

Non dovresti impostare il nopagingparametro, impostarlo su true significa ottenere tutti i post
Pieter Goosen

@PieterGoosen Se non imposto il nopagingparametro, viene visualizzato il valore predefinito false, quindi la prima pagina mostra 5 post, ma la query ne contiene di più. Aggiungo un'immagine alla domanda.
EliasNS

I tuoi commenti sono confusi, hai chiesto di limitare la quantità di post mostrati su una pagina a 5, questo è quello che ottieni. Ora dici (rileggi il tuo commento precedente :-)) la query ha più valore. Spiega per favore. Non è possibile impostare posts_per_page e quindi utilizzare no_paging impostato su true nella stessa query, è posts_per_page OPPURE nopaging impostato su true
Pieter Goosen

Risposte:


43

Penso che ora capisco cosa stai cercando di fare. Quando si esegue una query personalizzata con WP_Querye si imposta il limite per ottenere solo 5 post per pagina, verranno recuperati solo 5 post dalla query e tale query conterrà solo 5 post, MA per motivi di impaginazione, verrà WP_Querycomunque eseguito nell'intero database e conta tutti i post che corrispondono ai criteri della query.

Questo può essere visto quando si guardano le proprietà $found_postse $max_num_pagesdella query. Facciamo un esempio:

Hai 20 post appartenenti al tipo di post predefinito post. Hai solo bisogno degli ultimi 5 post senza impaginazione. La tua query è simile a questa

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) ti darà gli ultimi 5 post come previsto
  • echo $q->found_posts ti darà 20
  • echo $q->max_num_pages ti darà 4

L'impatto di questo lavoro extra è minimo sui siti con solo pochi post, ma può essere costoso se stai gestendo un sito con centinaia o migliaia di post. Questo è uno spreco di risorse se hai solo bisogno degli ultimi 5 post

Esiste un parametro non documentato chiamato no_found_rowsche utilizza valori booleani che è possibile utilizzare per liberare la query dopo aver trovato i 5 post necessari. Ciò costringerà a WP_Querynon cercare altri post per la matematica dei criteri dopo aver recuperato la quantità di post richiesti. Questo parametro è già incorporato get_posts, ecco perché get_postsè un po 'più veloce di WP_Querysebbene get_postsutilizziWP_Query

Conclusione

In conclusione, se non si intende utilizzare l'impaginazione su una query, è sempre consigliabile farlo 'no_found_rows=true'nella query per accelerare le cose e risparmiare spreco di risorse.


3

Dopo la conversazione con @Pieter Goosen sui commenti della domanda, penso di poter rispondere alla domanda e spiegare il mio errore.

La chiave è che found_postsmi stava confondendo. Ho pensato che quel numero è il post recuperato ma non lo è. È il numero di post che corrispondono ai criteri . È come se WP_Queryavesse 2 parti: una per trovare (tutti) i post e l'altra per recuperare il contenuto, quando controlla i paginationparametri. Quindi abbiamo la $post_countproprietà che è il numero di post recuperati (dice Codex The number of posts being displayed), che ovviamente è uguale al numero sul posts_per_pageparametro e al numero di elementi sulla $postsproprietà dell'array.

Quindi WP_Querynon sta facendo alcun lavoro inutile, come pensavo ^^

Spero che questo aiuti gli altri!


Vedi la mia risposta Penso di aver capito cosa intendi :-)
Pieter Goosen

Sì! Hai fatto molto bene: D Finalmente ho avuto il modo di farlo, e capisco tutto = D Grazie @PieterGoosen!
EliasNS

Fatto! Ha esteso la mia risposta ^^ @PieterGoosen
EliasNS

1

Ok, ti ​​consente di avere un tipo di post chiamato "blog_posts" e desideri recuperare 5 post di quel tipo di post. Ecco cosa devi fare

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


$query = new WP_Query($args);

La query sopra restituirà 5 post di tipo "blog_posts", se non è un tipo di post personalizzato, quindi sostituisci in questo modo 'post_type' => 'posts',se vuoi recuperare tutti i post e sostituisci in questo modo 'posts_per_page' => '-1',, per maggiori dettagli WP Query


Vedi i commenti sulla domanda, per favore.
EliasNS

1

So che @ user1750063 ha menzionato il codice ma prova questo

$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

idnon è un orderbyvalore valido ed paginationè un parametro non valido
Pieter Goosen

paginationnon è un parametro valido. Intendi 'nopaging' => true? Se sì, allora riceverò TUTTI i post. Non è quello che voglio. @PieterGoosen Penso che significhi ID.
EliasNS

orderby serve per visualizzare l'ordine, giusto? Non danneggia il valore / parametro di nopaging. @PieterGoosen perché ID e ordine non sono validi? Puoi chiarire il punto?
Shreyo Gi,

Dovrebbe essere ID, nonid
Pieter Goosen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.