Paginare pentru Pagina Custom Post Type
Am creat o pagină pentru tipurile mele de postări personalizate (custom post types). Codul poate fi văzut pe Snippi: http://snippi.com/s/e8852rx
Încerc să inserez paginate_links, dar din diverse motive nu apare deloc. Iată codul pentru paginate_links (acest cod funcționează pe fișierele normale archive.php):
<?php
global $wp_query;
$big = 999999999; // avem nevoie de un număr întreg improbabil
echo paginate_links( array(
'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages
) );
?>

Următorul cod funcționează pentru mine (am eliminat toată formatarea și meta-datelor personalizate pentru postări).
Aș mai adăuga că nu este clar de ce ai nevoie să folosești o pagină cu un șablon personalizat, în loc să creezi un șablon numit archive-portfolio.php
care este folosit pentru arhivele tipurilor de postări personalizate (vezi ierarhia șabloanelor)
<?php
/*
Șablon: Portofoliu
*/
?>
<?php get_header(); ?>
<div id="container">
<div id="portfolio_content">
<div id="portfolio_wrap">
<?php $loop = new WP_Query(array('post_type' => 'portfolio', 'posts_per_page' => get_option('to_count_portfolio'), 'paged' => get_query_var('paged') ? get_query_var('paged') : 1 )
); ?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
<span class="title"><?php the_title(); ?></span></br>
<?php endwhile; ?>
<?php
$big = 999999999; // un număr improbabil de mare
echo paginate_links( array(
'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $loop->max_num_pages
) );
?>
</div>
</div>
</div>
</div>
<?php get_footer(); ?>

În loc să folosești abordarea "$loop->have_posts()", așa cum a menționat Stephen Harris, poți încerca să parcurgi postările astfel:
<?php foreach ($loop->get_posts() as $post) { ?>
<span class="title"><?php echo $post->post_title; ?></span></br>
<?php } ?>

Ați încercat să utilizați pagina de arhivă principală pentru tipul de postare portofoliu?
Dacă mutați cea mai mare parte a codului într-un fișier archive-portfolio.php, atunci bucla ar trebui să fie configurată corect și paginarea ar trebui să funcționeze fără modificări suplimentare, fără funcții complicate, hack-uri sau soluții improvizate, exact cum funcționează pe arhivele de articole obișnuite.
De asemenea, aceasta înseamnă că nu aveți nevoie să utilizați o interogare personalizată, ci puteți folosi bucla principală, ceea ce va face ca pagina să se încarce mai rapid.

Absolut. Și dacă tipul de postare personalizat este configurat corect, pagina de arhivă va prelua slug-ul tipului de postare fără eforturi suplimentare: de ex., www.mysite/portfolio

Când îl schimb în archive-portfolio.php, codul original paginate_links nu funcționează. Lipsesc ceva?

Te referi la interogarea principală, deci este probabil că încearcă să afișeze doar 'postări' (posts), și nu tipul tău personalizat de postare.
Nu sunt sigur care este formatul tău exact, dar aș reface interogarea astfel -
$args = Array( // Array de argumente pentru query_posts()
'numberposts' => -1,
'posts_per_page' => get_option('posts_per_page'),
'paged' => $paged,
'post_type' => array('slug-tip-tau-post', 'alt-tip-post-daca-doresti')
);
query_posts($args);
Asta înseamnă că codul tău va deveni -
<?php
global $wp_query; // Nu ai nevoie de asta dacă nu ești într-o funcție, deci poate fi eliminat.
$args = Array( // Array de argumente pentru query_posts()
'numberposts' => -1,
'posts_per_page' => get_option('posts_per_page'),
'paged' => $paged,
'post_type' => array('slug-tip-tau-post', 'alt-tip-post-daca-doresti')
);
query_posts($args);
$big = 999999999; // avem nevoie de un număr improbabil
echo paginate_links( array(
'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages )
);
?>

Acesta este o problemă cu care m-am confruntat de multe ori.
Iată ce a funcționat pentru mine în această situație (WP 3.1.1):
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array( 'post_type' => 'custom_post_type', 'posts_per_page' => 5, 'paged' => $paged);
$loop = new WP_Query( $args );
if($loop->have_posts()):
while ( $loop->have_posts() ) : $loop->the_post();
//orice ieșire ai nevoie, cum ar fi, de exemplu:
the_excerpt();
endwhile;
endif;
?>
Apoi, pentru controalele de paginare:
<?php
echo custom_paginate_links(
array(
'format' => '?paged=%#%',
'current' => max( 1, get_query_var( 'paged' ) ),
'total' => $loop->max_num_pages
) );
?>

Ar fi mai bine să creezi o funcție în fișierul tău functions.php care să gestioneze paginarea și care să poată fi folosită în întreaga temă, atât pentru postări standard, cât și pentru tipuri personalizate de postări.
Cu următoarea funcție, adăugând get_pagination()
în tema ta, vei obține navigare oriunde ai nevoie. Am scris un articol pe blog despre asta aici: http://deadlyhifi.com/2011/06/non-bloated-pagination-for-your-wordpress-functions-php-file/ (iar codul este bazat inițial pe http://robertbasic.com/blog/wordpress-paging-navigation/)
/**
* O funcție de paginare
* @param integer $range: Intervalul slider-ului, funcționează cel mai bine cu numere pare
* Funcții WordPress folosite:
* get_pagenum_link($i) - creează link-ul, de ex. http://site.com/page/4
* previous_posts_link(' ‚ '); - returnează link-ul paginii Anterioare
* next_posts_link(' é '); - returnează link-ul paginii Următoare
* http://robertbasic.com/blog/wordpress-paging-navigation/
* adaptat de tdB ...
*/
function get_pagination($range = 4) {
global $paged, $wp_query;
// Câte pagini avem?
if ( !$max_page ) {
$max_page = $wp_query->max_num_pages;
}
// Avem nevoie de paginare doar dacă există mai mult de o pagină
if ( $max_page > 1 ) {
if ( !$paged ) $paged = 1;
echo '<div class="postpagination">';
// Pagina anterioară
previous_posts_link('Prev');
if ( $paged >= $range ) echo '<a href="' . get_pagenum_link(1) . '">1</a>';
if ( $paged >= ($range + 1) ) echo '<span class="page-numbers">…</span>';
// Avem nevoie de efectul de alunecare doar dacă există mai multe pagini decât intervalul
if ( $max_page > $range ) {
// Când suntem mai aproape de început
if ( $paged < $range ) {
for ( $i = 1; $i <= ($range + 1); $i++ ) {
echo ( $i != $paged ) ? '<a href="' . get_pagenum_link($i) .'">'.$i.'</a>' : '<span class="this-page">'.$i.'</span>';
}
// Când suntem mai aproape de sfârșit
} elseif ( $paged >= ($max_page - ceil(($range/2))) ) {
for ( $i = $max_page - $range; $i <= $max_page; $i++ ) {
echo ( $i != $paged ) ? '<a href="' . get_pagenum_link($i) .'">'.$i.'</a>' : '<span class="this-page">'.$i.'</span>';
}
// Undeva la mijloc
} elseif ( $paged >= $range && $paged < ($max_page - ceil(($range/2))) ) {
for ( $i = ($paged - ceil($range/2)); $i <= ($paged + ceil(($range/2))); $i++ ) {
echo ($i != $paged) ? '<a href="' . get_pagenum_link($i) .'">'.$i.'</a>' : '<span class="this-page">'.$i.'</span>';
}
}
// Mai puține pagini decât intervalul, nu este nevoie de efect de alunecare
} else {
for ( $i = 1; $i <= $max_page; $i++ ) {
echo ($i != $paged) ? '<a href="' . get_pagenum_link($i) .'">'.$i.'</a>' : '<span class="this-page">'.$i.'</span>';
}
}
// La ultima pagină, nu afișa link-ul Ultimei pagini
if ( $paged <= $max_page - ($range - 1) ) echo '<span class="page-numbers">…</span><a href="' . get_pagenum_link($max_page) . '">' . $max_page . '</a>';
// Pagina următoare
next_posts_link('Next');
echo '</div><!-- postpagination -->';
}
}

Nu am avut niciodată probleme cu utilizarea paginării pe un arhivă personalizată.
Așadar, în loc să creez o pagină și apoi să scriu propria interogare pe ea, pur și simplu copiez/lipește archive.php
și îi redenumesc pentru a se potrivi cu postarea personalizată, de exemplu archive-videos.php
.
Dacă chiar dorești să utilizezi un șablon personalizat pentru pagină, adaugă acest cod înaintea interogării tale:
query_posts( array( 'post_type' => 'videos', 'paged' => get_query_var('page') ) )
Mai multe informații: http://scribu.net/wordpress/wp-pagenavi/right-way-to-use-query_posts.html
