Query personalizzate e paginazione dei post

Come far funzionare i link alle pagine successiva e precedente in una query personalizzata di WordPress.

Questo è un post tecnico di 5 anni fa. Le istruzioni potrebbero non essere più valide.

Avete creato un query personalizzata per tirare fuori dal database tutti i vostri post archiviati sotto un certa categoria. I post sono circa 200 e per evitare di caricare una pagina con così tanti articoli decidete saggiamente che sarebbe bene mostrarne un certo quantitativo per pagina o, magari, tanti quanti avete scelto di mostrarne nelle preferenze di WordPress. Subito dopo il loop, quindi, inserite la riga:

next_posts_link( 'Pagina precedente' );

e poi questa:

previous_posts_link( 'Pagina successiva' );

Però vi accorgete che i link non appaiono.

Questione di query

Il motivo è presto detto. Quando in una pagina statica (cioè una pagina creata ad hoc) create una nuova query, abbiate presente che esiste già una query principale che popola la variabile globale $wp_query. In questa variabile, nel nostro caso della pagina statica creata appositamente, andranno le informazioni inerenti questa, come la data di creazione, il suo nome, il suo contenuto e tante altre. Le funzioni citate nelle due righe di sopra fanno riferimento proprio a questa variabile, infischiandosene della variabile popolata dalla query personalizzata.

Il punto sta, quindi, nel collegare le due funzioni poc’anzi citate alla query personalizzata. Lo si fa usando il secondo parametro che le due funzioni mettono a disposizione:

next_posts_link( $label, $max_pages );
previous_posts_link( $label, $max_pages );

Quel $max_pages quindi diventerà:

next_posts_link( 'Pagina precedente', $mia_variabile->max_num_pages );
previous_posts_link( 'Pagina successiva', $mia_variabile->max_num_pages );

Quel $mia_variabile è la variabile utilizzata per creare la query personalizzata, quella cioè che conterrà tutti i post e le loro informazioni, come ad esempio:

$mia_variabile = new WP_Query( $args );

Ma non finisce qui

Dopo aver collegato correttamente la funzione per la visualizzazione dei link alle pagine successiva e precedente, vi accorgete che la pagina 2 visualizza i post della prima, la 3 pure e così via.

Quest’altro punto va risolto aggiungendo un’ulteriore riga tra gli argomenti della query. Ad esempio:

$args = array(
	'category_name'  => 'mie-ricette',
	'tag'            => 'le-regionali',
	'posts_per_page' => 10,
	'orderby'        => 'date',
	'order'          => 'DESC',
	'paged'          => get_query_var( 'paged' )
);

$mia_variabile = new WP_Query( $args );

La riga che ci interessa è quella evidenziata. Con quella riga diciamo a WordPress di visualizzare la pagina (paged) X che gli è stata fornita quando abbiamo fatto clic sul link Pagina successiva (o precedente). Altrimenti per lui paged sarà sempre quello della prima.

Un esempio di tutto quanto fin qui detto lo trovate nelle mie pagine Featured posts, Guide su GNU/Linux e Guide su WordPress.

Note finali

1. Se volete che i post visualizzati in ogni pagina siano tanti quanti avete deciso nelle preferenze di WordPress, sostituite la riga 4 con questa:

'posts_per_page' => get_option( 'posts_per_page' ),

che va a prelevarsi proprio il valore impostato.

2. Se volete, poi, che l’output di next_posts_link venga inserito in una variabile anziché visualizzato, utilizzate get_next_posts_linkget_previous_posts_link.

3. se utilizzate il plugin WP-PageNavi, sappiate che anch’esso può essere reindirizzato sulla query personalizzata in questo modo:

wp_pagenavi( array( 'query' => $mia_variabile ) );

4. Come rilevato nei commenti a questo post e come descritto nel Codex, se la pagina statica è usata anche come homepage, le righe contenenti gli argomenti vanno modificate in tal senso:

$paged = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1;
$args = array(
	'category_name'  => 'mie-ricette',
	'tag'            => 'le-regionali',
	'posts_per_page' => 10,
	'orderby'        => 'date',
	'order'          => 'DESC',
	'paged'          => $paged
)

Grazie a Jonathan per la segnalazione.

Per approfondire

Autore: Aldo Latino

Aldo Latino usa con entusiasmo Linux nella distribuzione Ubuntu, è un appassionato di WordPress e si diletta a fare il blogger. Ha anche una lista dei desideri. Per altre informazioni visita la sua .

42 pensieri riguardo “Query personalizzate e paginazione dei post”

  1. Ciao, complimenti per il blog, mi ha salvato in parecchie occasioni! Ora però ho uno scoglio abbastanza difficile da superare. Mi trovo in una situazione analoga a quella descritta in questo post, ma non riesco a venirne a capo. Mi spiego meglio.
    Dal loop principale del blog devo evitare di mostrare post di determinate categorie e questo risultato lo ottengo scrivendo una query del tipo

    if ( is_home() ) {	
    	query_posts( 'cat=-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-53' );		
    }

    Funziona. Il problema come puoi immaginare è dovuto alla paginazione, che nonostante viene visualizzata non funziona, in quanto ricarica sempre gli stessi risultati (il motivo lo hai descritto chiaramente nel post).
    Ma, nel mio caso come dovrei scrivere il codice per far funzionare il tutto?
    Grazie mille!

    1. Ciao Carmine,
      hai provato a inserire il parametro relativo a “paged”?

      query_posts( 'cat=-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-53&paged=' . get_query_var('paged') );
  2. Ciao Aldo,
    complimenti per l’articolo, intanto.
    Mi trovo in una situazione più o meno simile ma non riesco a venirne a capo in nessun modo. Praticamente ho creato una pagina statica contenente dei post dinamici (2 per pagina) e vorrei fare in modo di poter scorrere questi post tramite “post precedenti” e “post successivi”. Effettivamente inserendo le funzioni next_posts_link e previous_posts_link, tali link non appaiono. Ho provato mille soluzioni, tra cui la tua, ma nessuna mi è stata d’aiuto. Credo che il problema derivi dal fatto che io non visualizzo i post per intero ma soltanto un “riassunto” dei post con foto di anteprima. Di seguito il codice che utilizzo:

    cat_name;?>
    <a href="” rel=”bookmark” title=””>

    Ho provato ad inserire il link per la paginazione sia dentro che fuori dalla lista (ul), ma niente da fare.
    Sapresti aiutarmi?

    Ti ringrazio anticipatamente,
    J.

        1. No, non sbagli. E’ esattamente quello che intendo, ma provo comunque a rispiegarlo :)

          Ho una pagina statica al cui interno visualizzo N post suddivisi per categorie. Questa lista di post deve però scorrere attraverso quelli che tu nella tua pagina chiami “Articoli più vecchi” e “Articoli più recenti”, attraverso le funzioni previous_posts_link e next_posts_link. Il fatto è che quando vado ad inserirle non si vedono. E se si vedono, non funzionano. Se vuoi ti copio tutto il codice della pagina .php, dimmi tu…

          Grazie!

          1. Perchè mi va in loop l’intero sito. Comincia a caricare, caricare, caricare e dopo minuti e minuti di caricamento visualizza infinite volte lo stesso post…

          2. Te ne sono veramente grato. Devo consegnare il sito entro una settimana e se non riesco a sistemare questa funzione (che poi dovrò in seguito applicare a diverse categorie) sto veramente nella cacca :D

            Questo il codice:
            http://pastebin.com/rtR8vtzA

            Confido in te! :D

          3. Avrai o qualche plugin che interferisce o qualcos’altro nel tema.

            Per capire se sono i plugin, prova quello script col tema Twenty Eleven pulito e non con quello su cui stai lavorando. Se funziona, allora è il tema su cui stai lavorando; altrimenti qualche plugin.

            Allego uno screenshot di quello che ottengo.

          4. Grazie dell’aiuto, intanto.

            Questo è quanto:
            Togliendo le classi “nav-previous/next” (probabile che devo ricontrollare il css, domani lo riguardo) succede che si vede solo il link PAGINA PRECEDENTE ma quando lo clicco mi rimane sempre sugli stessi post… come se refreshasse ogni volta la stessa pagina.
            Any idea?

          5. È corretto che ti aggiunga /page/2/ ma non che ti veda sempre lo stesso contenuto. Sei nella situazione che illustro nel paragrafo “Ma non finisce qui” del post di questa pagina, solo che nello script ti ho inserito la riga necessaria ad evitare ciò. Stai facendo le prove col tema di default di WordPress “Twenty Eleven”?

          6. Le prove le sto facendo col tema toolbox (
            http://wordpress.org/extend/themes/toolbox ), che è quello sul quale ho lavorato fin dall’inizio. Ho anche provato a disattivare tutti i plug-in, ma il problema persiste.
            Purtroppo non posso cambiare tema adesso, in quanto significherebbe rifare tutto da capo e non ho il tempo materiale per farlo. :'(

            Grazie lo stesso cmq, sei stato gentilissimo.

          7. RISOLTO! :D :D :D

            Tutta la mattinata a smanettarci ma alla fine ce l’ho fatta. Mi è bastato sostituire questo:

            $args = array( ‘posts_per_page’ => 2, ‘paged’ => get_query_var( ‘paged’ ) );

            con questo:

            $paged = (get_query_var(‘page’)) ? get_query_var(‘page’) : 1; $args = array( ‘posts_per_page’ => 2, ‘paged’ => $paged );

            e ora funziona alla perfezione. Praticamente ho scoperto che il problema è nella funzione get_query_var, la quale, se una pagina contenente post dinamici è statica ed è anche impostata come home-page, vuole il PAGE invece del PAGED. Una stupidaggine che mi ha fatto perdere tantissimo tempo. Comunque molte grazie perchè il tuo articolo e il tuo aiuto mi sono stati di FONDAMENTALE aiuto. Grazie davvero.

            Buona giornata,
            J.

          8. Sono molto contento che hai risolto ed effettivamente avrei dovuto indirizzarti meglio: ne accennai in questo post, al paragrafo “Variabili globali di post e pagina”. La tua home, infatti, viene suddivisa in più parti (pag. 2, 3, ecc.). Non ci avevo pensato proprio. Nelle mie prove in locale, poi, non avevo impostato come home la pagina statica di test.

            Il Codex stesso dà qui la soluzione, nella Nota a fondo paragrafo.

            Grazie per aver segnalato la soluzione. :-)

  3. gentile aldolat, ho letto e riletto il tuo articolo,ma non riesco a visualizzare i post precedenti e successivi. le pagine cambiano,ma gli articoli rimangono sempre gli stessi.
    mi sto scervellando, ma non so dove mettere le mai.
    ho una pagina statica di wordpress 3.3.2
    mi puoi aiutare?
    grazie
    elita

    1. Ciao Elita, hai letto con attenzione il paragrafo “Ma non finisce qui” e la relativa nota finale n. 4?

      P.S. Puoi chiamarmi semplicemente Aldo. :)

      1. ciao aldo,intanto grazie per avermi risposto.
        credimi che ho letto con attenzione, teoricamente ho capito qualcosa, ma quando vado a mettere mano, eh, è un’altra cosa.
        sotto questo ho inserito questo :
        max_num_pages );?>
        max_num_pages );?>
        il punto quattro

        $paged = ( get_query_var( ‘page’ ) ) ? get_query_var( ‘page’ ) : 1;non so dove inserirlo e non so nemmeno se vada bene inserire solo la “stringa” qui sopra.
        rigrazie
        elita

        1. Mi sa che WordPress ti ha segato il codice.

          Ad ogni modo, mi pare di capire che la tua situazione è:
          1) hai creato correttamente un loop personalizzato;
          2) hai inserito il codice per visualizzare i link alle pagine precedente e successiva.

          Il problema sta nel fatto che questi link puntano alla pagina 2, 3 ecc., ma il contenuto è sempre lo stesso. O sbaglio?

          Per correggere il problema devi aggiungere tra gli argomenti di WP_Query questo:
          'paged' => get_query_var( 'paged' )

          Fammi sapere come andrà.

          1. ciao aldo,
            questo è ciò che mi ha mangiato:

            max_num_pages );?>
            max_num_pages );?>

            e questo è quello che ho inserito:
            =
            get_query_var( ‘paged’ );
            query_posts($query);
            ?>

            Ho dovuto cambiare il segno da così => a così >=perchè mi dava errore di sintassi.
            ma……le pagine girano e i post rimangono gli stessi.
            riconosco che sono “un pò” imbranata. :))

          2. Non puoi postare certo tipo di codice nei commenti: hai fatto bene a usare pastebin. :)

            Ascolta, per capire come funziona il meccanismo, parti da qualcosa di semplice. Vai qui: http://pastebin.com/3EtCWABr e copia il contenuto in un file php vuoto. Creati una pagina nuova in WP e usa questo nuovo template. Dovrebbe funzionare facendoti vedere solo il titolo del post e alla fine anche i link alle pagine.

            Dopo potrai riempirlo con tutto quello che manca (header, sidebar, ecc.)

          3. uau aldo,che sorpresona.
            funziona eccome.
            sono veramente contenta.
            lo ritengo un regalo da parte tua per il mylove mami.
            grazie di cuore.
            elita

          4. mia mamma. di quelle che ce n’è una sola .
            ora non c’è più e il sito vuole essere un filo gettato fino a lei, io da un capo e lei dall’altro,per non dimenticare .
            grazie :))

  4. Ciao Aldo, complimenti per il post…
    Ho un problema con la paginazione dei post provenienti da un “Custom Post Type” chiamato “strutture” dove ho creato alcune strutture affiliate.

    Attraverso il file “archive-strutture.php” visualizzo senza problemi il contenuto del “CPT” però il problema avviene se vado a creare un “Filtro di Ricerca”.

    Ho creato un form che permette di scegliere le strutture da visualizzare indicando la “Tipologia” e “Località” e funziona perfettamente.
    La paginazione però NO….
    In pratica quando cerco di richiamare la pagina successiva, non la trova!.
    Di default, entrando nella pagina “miosito.it/strutture” (dove risponde “archive-strutture.php” visualizzo i post senza problemi, predisposti per Tipologia=castelli – Località=Roma.
    Anche la navigazione funziona in tal caso.
    Quando però utilizzo il “Form-Filtro” magari scegliendo Tipologia=ville – Località=Perugia, visualizzo il contenuto filtrato come desiderato però la Paginazione non funziona. Infatti “cliccando” sul link della pag_successiva, come url ho:
    “miosito.it/strutture/page/2/”
    però il contenuto non c’è!…

    Puoi aiutarmi a risolvere per favore?
    Grazie infinite….

    1. Ciao Dany,
      ho qualche difficoltà a comprendere appieno la situazione in cui ti trovi ed è attualmente da anni che non tocco questo argomento. Ad ogni modo, hai dato una lettura al Codex qui e qui?

  5. Ciao Aldo,
    ho appena risolto…
    Avevo un conflitto con il Tema che utilizzavo che non mi permetteva di far funzionare la Paginazione…
    Ora tutto ok, grazie anche alla tua guida!….
    A presto.

I commenti sono chiusi