Paginare pe un șablon de pagină personalizat
Am creat un tip de postare personalizat numit 'Evenimente'. Din motive pe care nu le voi detalia, am ales să nu folosesc archive-events.php
ca șablon de arhivă pentru Evenimente. În schimb, am decis să creez un șablon de pagină personalizat, page-upcoming-events.php
, pe care să-l folosesc ca arhivă.
Am scris o interogare personalizată în acest șablon pentru a prelua evenimentele. De asemenea, am limitat posts_per_page la 4. Am reușit să adaug link-uri de paginare folosind funcțiile previous_posts_link()
și next_posts_link()
.
Aceste funcții generează link-uri către URL-urile așteptate: /upcoming-events/page/2/, etc.
Pe pagina 1, primesc primele 4 evenimente și link-ul către următoarele evenimente.
Problema pe care o am este că atunci când merg la pagina 2, primesc o eroare 404, nu evenimentele 5-8.
Cum pot adăuga corect paginarea pe un șablon de pagină personalizat?

Iată ce fac eu pentru paginare. Sper să te ajute să te îndrepți pe drumul cel bun, poate fi exagerat pentru ceea ce încerci să faci...
Mai întâi setez $paged:
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
Apoi construiește array-ul $args, asigură-te să incluzi:
'paged' => $paged
Rulează interogarea includând funcțiile necesare pentru paginare (acesta este un exemplu, modifică ce ai nevoie pentru a-l personaliza):
//interogarea folosind argumentele de mai sus
$wp_query = new WP_Query( $args );
//folosește interogarea pentru paginare
$wp_query->query_vars[ 'paged' ] > 1 ? $current = $wp_query->query_vars[ 'paged' ] : $current = 1;
//configurează array-ul "paginate_links" pentru a face ceea ce dorim. Verifică codex-ul pentru exemple 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'
);
//construiește link-urile de paginare
if ( $wp_rewrite->using_permalinks() )
$pagination[ 'base' ] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );
//mai multe link-uri de paginare
if ( !empty( $wp_query->query_vars[ 's' ] ) )
$pagination[ 'add_args' ] = array( 's' => get_query_var( 's' ) );
//rulează interogarea
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();
Tot ce rămâne este să spui paginii unde dorești să apară link-urile:
//afișează link-urile de paginare pe pagină
echo '<div class="pydPaging">' . paginate_links($pagination) . '</div>';
Din nou, poate fi exagerat, dar funcționează foarte bine.

Ești sigur că nu ai o pagină cu același nume ca și tipul de postare personalizată? Dacă da, regulile de rescriere a permalinkurilor se vor încurca și vor declanșa o eroare 404.
O soluție foarte simplă este: pagina care listează tipurile de postări personalizate să fie denumită la plural (de ex. produse), iar numele real al tipului de postare să fie la singular (de ex. produs). Astfel, nu vor intra în conflict și totul va funcționa corect.
De asemenea, asigură-te întotdeauna să rescrii fișierul .htaccess atunci când creezi un nou Tip de Postare Personalizată.
