Recentemente mi sono trovato a dover realizzare un tipo di articolo con template differente (come descritto in questo articolo) dagli altri, nel fare questo mi sono ritrovato nella situazione quindi di dover poi realizzare una categoria che raccoglieva l’elenco di questi articoli. In fin dei conti però non avevo mai avuto la necessità di differenziare la paginazione tra le categorie e di conseguenza non mi ero mai posto il problema.

Settare un numero diverso di articoli esposti per categorie diverse…

Costretto dalle esigenze ho scoperto che la risposta era molto più difficile da trovare di quanto pensassi.
Quello che occorre fare è andare a forzare la funzione che restituisce i risultati affinchè venga sovrascritto il valore di default che impostiamo dal pannello impostazioni di wordpress. Vi anticipo già che tutte le soluzione trovate che non intervengono anche sul file functions.php NON hanno funzionato. Se qualcuno avesse altre strade valide le scriva pure nei commenti, provvederò ad includere nell’articolo 🙂

L’errore 404

L’errore che si propone inserendo la funzione posts_nav_link() senza accorgimenti è quello di vedere mostrato il link di paginazione ma di restituire sempre un Error 404 – Page not Found quando si clicca sopra e si raggiunge (se si hanno i permalinks attivi) la /page/2/…

La soluzione nel file functions.php

La soluzione definitiva che ho trovato è quindi quella che trovate di seguito.
Nel file functions.php andremo a scrivere:

add_action( 'parse_query', 'category_posts_per_page', 10, 1 );
    function category_posts_per_page( $q_obj ) {
        if( is_category('18') ) // numero categoria da sostituire con l'ID della propria categoria
            $q_obj->query_vars['posts_per_page'] = 3; // Numero da sostituire con il valore desiderato
    }

Dove indicheremo l’ID della categoria in cui vogliamo mostrato un numero di articoli diverso e il numero stesso.

Nel template di categoria invece (vale anche utilizzando la nomenclatura category-ID.php) scriveremo:

< ?php if (in_category('18')): ?>
 
            < ?php if (have_posts()) : while (have_posts()) : the_post(); ?>
 
          <!--Dentro al Loop stamperai i campi e quello che ti interessa-->              
          <div class="title">< ?php the_title();?> </div>
          <div class="content"></div>       
 
        < ?php endwhile; endif; ?>
        < ?php posts_nav_link(); ?> 
    < ?php endif; ?>

Che non è nient’altro che un normale loop di WordPress, terminato il quale inseriamo la funzione posts_nav_link() per stampare i link di paginazione.
Con questo piccolo accorgimento, e le indicazione fornite nell’articolo citato ad inizio pagina, non avremo più problemi nel realizzare articoli personalizzati e listing di categorie diverse e con paginazione differente.
Qualcuno di voi conosce altri metodi? E questo qualcuno l’ha già utilizzato? Che impatto ha sulle query a livello di prestazioni?