Come limitare il numero di post ottenuti da WP_Query?

18 mar 2015, 12:52:15
Visualizzazioni: 247K
Voti: 48

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.

Esempio di codice WP_Query con posts_per_page

Come posso fare questo?

7
Commenti

Solo 'posts_per_page=5'

Pieter Goosen Pieter Goosen
18 mar 2015 12:56:47

Uso quello, ma trova tutti i post. Se accedo alla proprietà found_posts, mostra un numero maggiore di 5. Voglio che la mia query contenga solo 5 post. È possibile? @PieterGoosen

Elías Gómez Elías Gómez
18 mar 2015 13:03:05

Non dovresti impostare il parametro nopaging, impostarlo su true significa ottenere tutti i post

Pieter Goosen Pieter Goosen
18 mar 2015 13:05:14

@PieterGoosen Se non imposto il parametro nopaging viene utilizzato il valore predefinito che è false, quindi la frontpage mostra 5 post, ma la query ne contiene di più. Aggiungo un'immagine alla domanda.

Elías Gómez Elías Gómez
18 mar 2015 13:09:37

I tuoi commenti sono confusi, hai chiesto di limitare il numero di post mostrati in una pagina a 5, questo è quello che ottieni. Ora dici (rileggi il tuo commento precedente :-)) che la query ne contiene di più. Per favore spiega. Non puoi impostare posts_per_page e poi usare no_paging impostato su true nella stessa query, è necessario usare o posts_per_page OPPURE nopaging impostato su true

Pieter Goosen Pieter Goosen
18 mar 2015 13:14:11

La mia domanda dice "ottiene". Penso che se la query contiene più post di quelli mostrati, sta facendo più lavoro del necessario. Voglio solo sapere se è possibile evitare questo. Non voglio risultati navigabili con una navigazione nascosta.

Elías Gómez Elías Gómez
18 mar 2015 13:19:43

La query non conterrà più articoli di quelli che hai richiesto. Se chiedi 5, verranno recuperati 5 articoli se ci sono più di 5 articoli che soddisfano i requisiti. Fai un var_dump() della tua query, come se la tua variabile di query fosse $query, esegui var_dump( $query->posts ). Vedrai solo i 5 articoli per cui hai fatto la query

Pieter Goosen Pieter Goosen
18 mar 2015 13:26:28
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 4
0
79

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 previsto
  • echo $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.

18 mar 2015 14:22:12
1

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

18 mar 2015 13:07:02
Commenti

Vedi i commenti sulla domanda, per favore.

Elías Gómez Elías Gómez
18 mar 2015 13:14:16
4

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
18 mar 2015 13:50:22
Commenti

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

Pieter Goosen Pieter Goosen
18 mar 2015 13:58:09

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 Elías Gómez
18 mar 2015 14:00:29

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 Shreyo Gi
18 mar 2015 14:22:21

Dovrebbe essere ID, non id

Pieter Goosen Pieter Goosen
18 mar 2015 14:25:11
3

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!

18 mar 2015 14:16:53
Commenti

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

Pieter Goosen Pieter Goosen
18 mar 2015 14:23:23

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 Elías Gómez
19 mar 2015 02:17:48

Fatto! Ho esteso la mia risposta ^^ @PieterGoosen

Elías Gómez Elías Gómez
19 mar 2015 16:25:22