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_poststi restituirà20echo $q->max_num_pagesti 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
Pieter Goosen
pagination non è un parametro valido. Intendi 'nopaging' => true? Se sì, otterrò TUTTI i post. Non è quello che voglio. @PieterGoosen Penso intenda ID.
Elías Gómez
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?
Shreyo Gi
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!
Elías Gómez