Paginazione in un template di pagina personalizzato
Ho configurato un custom post type chiamato 'Eventi'. Per motivi che non approfondirò, ho scelto di non usare archive-events.php
come template archivio per i miei Eventi. Invece, ho deciso di creare un template di pagina personalizzato, page-upcoming-events.php
, da usare come archivio.
Ho scritto una query personalizzata in questo template per recuperare gli eventi. Sto anche limitando posts_per_page a 4. Ho aggiunto con successo i link di paginazione usando le funzioni previous_posts_link()
e next_posts_link()
.
Queste funzioni generano link agli URL previsti: /upcoming-events/page/2/, ecc.
Nella pagina 1, ottengo i primi 4 eventi e il link agli eventi successivi.
Il problema che sto riscontrando è che quando vado alla pagina 2, ricevo un errore 404 invece degli eventi 5-8.
Come posso aggiungere correttamente la paginazione a un template di pagina personalizzato?

Ecco come gestisco la paginazione. Spero che ti aiuti a intraprendere la strada giusta, potrebbe essere eccessivo per quello che stai cercando di fare...
Per prima cosa imposto $paged:
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
Poi costruisci il tuo array $args, assicurati di includere:
'paged' => $paged
Esegui la tua query includendo le funzioni necessarie per la paginazione (questo è un esempio, modificalo in base alle tue esigenze):
// la query utilizzando gli argomenti sopra
$wp_query = new WP_Query( $args );
// usa la query per la paginazione
$wp_query->query_vars[ 'paged' ] > 1 ? $current = $wp_query->query_vars[ 'paged' ] : $current = 1;
// imposta l'array "paginate_links" per fare quello che desideriamo. Consulta il codex per esempi http://codex.wordpress.org/Function_Reference/paginate_links
$pagination = array(
'base' => @add_query_arg( 'paged', '%#%' ),
//'format' => '',
'showall' => false,
'end_size' => 4,
'mid_size' => 4,
'total' => $wp_query->max_num_pages,
'current' => $current,
'type' => 'plain'
);
// costruisci i link di paginazione
if ( $wp_rewrite->using_permalinks() )
$pagination[ 'base' ] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );
// ulteriori link di paginazione
if ( !empty( $wp_query->query_vars[ 's' ] ) )
$pagination[ 'add_args' ] = array( 's' => get_query_var( 's' ) );
// esegui la query
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();
Non resta che indicare alla pagina dove vuoi che compaiano i link:
// stampa i link di paginazione nella pagina
echo '<div class="pydPaging">' . paginate_links($pagination) . '</div>';
Ripeto, potrebbe essere eccessivo, ma funziona bene.

Sei sicuro di non avere una pagina con lo stesso nome del custom post type? Se è così, le regole di riscrittura dei permalink si confonderanno e genereranno un errore 404.
Una soluzione molto semplice è: la pagina che elenca i custom post type deve essere al plurale (es. prodotti) mentre il nome effettivo del post type deve essere al singolare (es. prodotto). In questo modo non ci saranno conflitti e tutto funzionerà correttamente.
Assicurati sempre di riscrivere il file .htaccess quando crei un nuovo Custom Post Type.
