Come limitare il numero di post ottenuti da WP_Query?
Ho fatto ricerche su Google e WPSE e l'unica cosa che vedo ripetutamente è l'uso di showposts
, che è deprecato.
Ho familiarità con WP_Query
, e pensavo che impostando posts_per_page
al mio limite (ad esempio 5), e nopaging
a true
, si sarebbe tradotto in qualcosa tipo "Ok, ti darò solo 5 post". Ma questo non funziona.
Come posso fare questo?
Penso di aver capito ora cosa stai cercando di fare. Quando esegui una query personalizzata con WP_Query
e imposti il limite per ottenere solo 5 articoli per pagina, verranno recuperati solo 5 articoli da quella query e quella query conterrà solo 5 articoli, MA ai fini della paginazione, WP_Query
continua a scorrere l'intero database e conta tutti gli articoli che corrispondono ai criteri della query.
Questo può essere visto quando si osservano le proprietà $found_posts
e $max_num_pages
della query. Prendiamo un esempio:
Hai 20 articoli appartenenti al tipo di post predefinito post
. Ti servono solo gli ultimi 5 articoli senza paginazione. La tua query sarà così:
$q = new WP_Query( 'posts_per_page=5' );
var_dump( $q->posts )
ti restituirà gli ultimi 5 articoli come previstoecho $q->found_posts
ti restituirà20
echo $q->max_num_pages
ti restituirà4
L'impatto di questo lavoro extra è minimo sui siti con pochi articoli, ma può diventare costoso se stai gestendo un sito con centinaia o migliaia di articoli. Questo è uno spreco di risorse se hai bisogno solo degli ultimi 5 articoli.
Esiste un parametro non documentato chiamato no_found_rows
che utilizza valori booleani che puoi utilizzare per far terminare la query dopo aver trovato i 5 articoli di cui hai bisogno. Questo forzerà WP_Query
a non cercare altri articoli che corrispondono ai criteri dopo aver recuperato la quantità di articoli richiesti. Questo parametro è già integrato in get_posts
, ecco perché get_posts
è un po' più veloce di WP_Query
nonostante get_posts
utilizzi WP_Query
Conclusione
In conclusione, se non hai intenzione di utilizzare la paginazione in una query, è sempre consigliabile utilizzare 'no_found_rows=true'
nella tua query per velocizzare le cose e risparmiare risorse inutili.

Ok, supponiamo che tu abbia un tipo di post chiamato 'blog_posts' e vuoi recuperare 5 post di quel tipo. 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, sostituisci semplicemente con 'post_type' => 'posts',
. Se vuoi recuperare tutti i post, sostituisci con 'posts_per_page' => '-1',
. Per maggiori dettagli consulta WP Query

So che @user1750063 ha menzionato il codice ma prova questo
$args = array (
'post_type' => 'custom_post', // tipo di post personalizzato
'nopaging' => false, // abilita la paginazione
'posts_per_page' => '5', // mostra 5 post per pagina
'order' => 'DESC', // ordine decrescente
'orderby' => 'ID', // ordina per ID
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// mostra il contenuto
}
} else {
// mostra quando non vengono trovati post
}
wp_reset_postdata(); // Ripristina i dati originali del Post

id
non è valido come valore per orderby
e pagination
è un parametro non valido

pagination
non è un parametro valido. Intendi 'nopaging' => true
? Se sì, otterrò TUTTI i post. Non è quello che voglio. @PieterGoosen Penso intenda ID
.

orderby serve per visualizzare l'ordine, giusto? Non influisce sul valore/parametro nopaging.
@PieterGoosen perché ID e orderby non sono validi? Puoi chiarire questo punto?

Dopo la conversazione con @Pieter Goosen nei commenti della domanda, penso di poter rispondere alla domanda e spiegare il mio errore.
Il punto chiave è che found_posts
mi stava confondendo. Pensavo che quel numero rappresentasse i post recuperati ma non è così. È il numero di post che corrispondono ai criteri. È come se WP_Query
avesse 2 parti: una per trovare (tutti) i post, e l'altra per recuperare il contenuto, quando controlla i parametri di pagination
. Quindi abbiamo la proprietà $post_count
che è il numero di post recuperati (il Codex dice Il numero di post che vengono visualizzati
), che ovviamente è uguale al numero nel parametro posts_per_page
, e al numero di elementi nell'array della proprietà $posts
.
Quindi WP_Query
non sta facendo alcun lavoro inutile, come pensavo ^^
Spero che questo aiuti altri!

Sì! L'hai fatto molto bene :D Finalmente ho trovato il modo di farlo, e ho capito tutto =D Grazie @PieterGoosen!
