Visualizzare un diverso numero di post in certe aree

Potrebbe rivelarsi utile, talvolta, presentare in un template un numero di post diverso da quanto specificato nelle preferenze di WordPress. Con una semplice funzione è possibile.

Come sappiamo, dalle preferenze di WordPress impostiamo il numero predefinito di post da visualizzare in home, in una pagina archivio, nei risultati di una ricerca e così via. Ma può capitare di avere la necessità di visualizzarne un numero diverso in alcuni template. Ad esempio, è certamente utile per il lettore visualizzare nei risultati di una ricerca un numero più elevato di post, magari anche senza il contenuto o solo con una breve introduzione.

Apportare questa modifica al proprio blog è abbastanza semplice se si utilizza un filtro. Ci sono almeno due modi per farlo: in questo post vi mostro quello che uso io.

Nel file functions.php incollare questa nuova funzione:

function ubn_posts_per_page() {
	global $wp_query;
	if ( is_archive() || is_search() ) {
		$wp_query->query_vars['posts_per_page'] = 25;
	}
}
add_filter( 'pre_get_posts', 'ubn_posts_per_page' );

Il valore da personalizzare, ovviamente, è quel 25. Potete anche aggiungere altre condizioni nella riga 3. In questo blog, ad esempio, la riga si presenta precisamente così:

if (is_search() || is_archive() || is_page('featured')) {

Per quanto riguarda il lato tecnico, la funzione viene eseguita proprio prima di ricevere i post e altera, mediante un filtro, il valore ricavato dalle preferenze memorizzate nel database, cambiandolo con quello inserito qui. Semplice ed efficace.

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 .

22 pensieri riguardo “Visualizzare un diverso numero di post in certe aree”

  1. Ciao Aldo…
    Sto battendo il web in cerca di una soluzione. Magari tu lo sai, quindi ci provo: la funzione utilissima che hai postato… se come condizione metto solo
    if (is_category()) {
    funziona alla perfezione con i permalink settati su default. Ma se utilizzo l’opzione %postname% per i permalink non c’è verso di passargli il valore e va a pescare sempre e comunque la globale $posts_per_page.
    Any idea?
    Grazie, ciao

    1. Ciao Manuel,
      hai provato col tema Twenty Ten e disabilitando i plugin? Te lo chiedo perché potrebbe dipendere da qualche funzione nel tema che stai usando che scavalca quella che vuoi aggiungere oppure da qualche plugin.
      Ti confermo che usando come struttura di permalink /%postname%/ e usando come condizione soltanto is_category() la funzione presente nell’articolo funziona a dovere.

      Fammi sapere se risolvi.

      1. Hai ragione Aldo… meno male che mi hai detto di provare con Twenty Ten!! Ti sono debitore.
        Sto sviluppando questo tema da quasi due mesi e avevo tralasciato una funzione che andava in conflitto con questa.
        Sarei andato avanti una settimana a cercare non so quale workaround se non era per te… a riprova che la soluzione più semplice è sempre la migliore!!
        Grazie mille e buon lavoro!!

  2. Ciao, vorrei chiederti una cortesia, se possibile
    Il tuo codice funziona bene nel mio tema, però non funziona là dove lo vorrei di più, cioè nelle pagine di navigazione (… intendo /page/2, /page/3, ecc.), non so il termine giusto da aggiungere nelle condizioni
    Ho il plugin WP paginate, se può servire saperlo
    Inoltre, vorrei escludere una certa categoria (ID 243) dalla funzione.
    E’ possibile?
    Grazie

    1. Ciao,
      non ho ben capito cosa intendi fare, ma proviamo lo stesso.
      Tu vorresti che nelle pagine 2, 3, ecc., della home venisse visualizzato un numero diverso di pagine da quanto stabilito; vorresti anche che nella pagina di archivio della categoria XYZ si impostasse un numero personalizzato.

      Se è così, prova in questo modo:

      function ubn_posts_per_page() {
      	global $wp_query;
      	if( $wp_query->is_home && $wp_query->query_vars[paged] > 1 ) { // Se siamo nella home, dalla pagina 2 in poi
      		$wp_query->query_vars['posts_per_page'] = 3;
      	} elseif( is_category( 'xyz' ) ) { // Se siamo nella pagina di archivio della categoria "XYZ"
      		$wp_query->query_vars['posts_per_page'] = 1;
      	} elseif( is_archive() || is_search() ) { // Se siamo in qualunque pagina di archivio o in una ricerca
      		$wp_query->query_vars['posts_per_page'] = 2;
      	}
      }
      add_filter('pre_get_posts', 'ubn_posts_per_page');

      Ricordati che devi sostituire la funzione con lo stesso nome ubn_posts_per_page() che forse stai usando già.

      Come vedi, ti ho anche commentato il codice, in modo da agevolarti la personalizzazione. In pratica puoi personalizzare il numero di post visualizzati in molti ambiti del tuo blog.

      Fammi sapere come andrà.
      Ciao!

  3. Non proprio… ciò che chiedo è forse più semplice :)
    Il tuo codice così com’è (il primo) funziona ovunque, tranne che nelle pagine 2, 3, ecc… della home. Vorrei funzionasse anche lì, con lo stesso numero impostato per le altre (tipo il tuo 25 o altro che imposto io)

    Invece, in una categoria (ID 243) vorrei non funzionasse proprio, cioè che non venisse toccata da questo codice. E’ una categoria a parte funzionante in modo diverso (non rientrante nel “ciclo” WP, cioè gli articoli scritti qui non vanno in home-page), e per questa ho già la possibilità di scegliere quanti titoli far apparire nella sua pagina archivio,mediante opzioni a parte inserite nel mio tema…

    Non so se così è più chiaro

    1. Il codice che ho pubblicato nel post non ha alcun effetto sulla home, quindi non so come ti possa funzionare lì (intendo la prima pagina della home).

      Se intendi farlo agire bene anche su di essa e le sue successive (da page/2/ in poi), devi aggiungere un’altra condizione:

      function ubn_posts_per_page() {
          global $wp_query;
          if ( is_home() || is_search() || is_archive() ) {
              $wp_query->query_vars['posts_per_page'] = 3;
          }
      }
      add_filter('pre_get_posts', 'ubn_posts_per_page');

      Per quanto riguarda l’esclusione di una pagina di archivio di una categoria, nel mio commento precedente ti ho già dato la soluzione, che comunque per tua comodità ti riporto qui:

      function ubn_posts_per_page() {
      	global $wp_query;
      	if( is_category( 243 ) ) {
      		$wp_query->query_vars['posts_per_page'] = 1; // Qui metti il numero di post per questa categoria
      	}
      	elseif ( is_home() || is_search() || is_archive() ) { // Qui metti il numero di post per Home, ricerca e archivio ed eventualmente togli le condizioni che non ti servono
      		$wp_query->query_vars['posts_per_page'] = 3;
      	}
      }
      add_filter('pre_get_posts', 'ubn_posts_per_page');

      Ciao!

  4. Innazitutto grazie delle risposte e della velocità, sei molto gentile.

    Il codice che ho pubblicato nel post non ha alcun effetto sulla home, quindi non so come ti possa funzionare lì (intendo la prima pagina della home).

    No, per “funziona ovunque” non intendevo che a me funziona anche la home, davo per scontato che fosse esclusa dal ragionamento :)

    Se intendi farlo agire bene anche su di essa e le sue successive (da page/2/ in poi), devi aggiungere un’altra condizione:

    Intendo farlo agire dalla 2 in poi… per la home uso il setting presente in WP

    Domani con più calma provo tutto, per il momento ho potuto solo chiarire i fraintendimenti, poi eventualmente ti dico come va… grazie!

  5. Allora Aldo, approfitto ancora della tua pazienza, finché ne hai… :)
    E’ solo perché non ci capiamo bene, ma so che tra quei codici si ricava quello giusto, è che non riesco a metterlo insieme come vorrei.

    Io vorrei una cosa pulita come il primo codice, che però agisse anche sulle pagine 2, 3, 4…, oltre agli archivi naturalmente (e lo fa).
    Non sulla home (che non lo fa, e va bene).
    Quindi, lì l’effetto manca solo sulle pagine dalla 2 in poi, e io vorrei agisse anche lì.

    Tra le prove che ho fatto, una funziona (non ricordo però com’era, forse ho tolto “home”), cioè mi fa vedere il n. che voglio nelle pagine da 2 in poi, ma il problema è che nella home in fondo si vede un numero di pagine sbagliato (cioè come se non fosse cambiato niente), nonostante la nuova impaginazione data dal codice, che naturalmente fa ridurre le pagine perché aumenta il n° di articoli per pagina.

    Purtroppo non è che riesco a fare tante prove, non ho il sito in locale e devo farle on line, e poi rimettere com’era prima quando vedo che non vanno.

    Per quanto riguarda l’esclusione della categoria, magari ne parliamo in seguito (se ne avrai voglia…) se no faccio casino
    (Il codice per l’esclusione funziona e potrei usare quello, ma non vorrei duplicare una funzione che già esiste, poi semmai spiego meglio).

  6. Ma certo Aldo. Nella sezione archivi, avendo settato nel mio blog 3 articoli a pagina, mi venivano visualizzati 3 articoli anche nelle pagine archivi, ma riassunti. Così facendo risultava la colonna centrale sempre corta al cospetto della colonna “opzioni” di sinistra. Ora avendo settato 8 il numero di articoli (riassunti) da pubblicare nella sezione archivi, il blog è più uniforme. Spero di essermi spiegato.

    1. Quel pulsante ti consente di conservare il link per una lettura successiva usando il servzio di Instapaper, che trovo davvero comodo e utile. Se tu fossi già utente di quel servizio, il pulsante si trasformerebbe in “Saved”, mentre ti rimanda alla pagina di login di Instapaper se non sei autenticato lì (o di creazione di nuovo account se non ne hai uno).

I commenti sono chiusi