Paginazione in un template di pagina personalizzato

25 ott 2011, 21:23:15
Visualizzazioni: 13.9K
Voti: 3

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?

0
Tutte le risposte alla domanda 2
1

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.

1 dic 2011 19:56:39
Commenti

la funzione paginate_links($pagination) mi restituisce vuoto

AGrush AGrush
14 apr 2022 17:05:33
0

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.

19 apr 2022 11:40:08