Paginazione della Pagina dei Tipi di Post Personalizzati
Ho creato una pagina per i miei tipi di post personalizzati. Il codice può essere visualizzato su Snippi: http://snippi.com/s/e8852rx
Sto cercando di inserire paginate_links, ma per qualche motivo non viene visualizzato. Ecco il codice di paginate_links (questo codice funziona normalmente nei file archive.php):
<?php
global $wp_query;
$big = 999999999; // serve un numero intero improbabile
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
) );
?>

Il seguente codice funziona per me (ho rimosso tutta la formattazione / custom post meta).
Aggiungo che non è chiaro perché sia necessario utilizzare una pagina con un template personalizzato, invece di creare un template chiamato archive-portfolio.php
che viene utilizzato per le pagine archivio dei custom post type (vedi gerarchia dei template)
<?php
/*
Template Name: Portfolio
*/
?>
<?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; // serve un numero improbabile
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(); ?>

Invece di utilizzare l'approccio "$loop->have_posts()", come ha sottolineato Stephen Harris, puoi anche provare a ciclare i post in questo modo:
<?php foreach ($loop->get_posts() as $post) { ?>
<span class="title"><?php echo $post->post_title; ?></span></br>
<?php } ?>

Hai provato a utilizzare la pagina di archivio principale del tipo di post portfolio?
Se sposti la maggior parte del tuo codice in un file archive-portfolio.php, allora il loop dovrebbe essere configurato correttamente e l'impaginazione dovrebbe funzionare immediatamente, senza funzioni strane, hack o soluzioni approssimative, proprio come avviene negli archivi dei post.
Significa anche che non hai bisogno di utilizzare una query personalizzata, puoi semplicemente usare il main loop, rendendo il caricamento della pagina più veloce

Assolutamente. E se il custom post type è configurato correttamente, la pagina archivio prenderà lo slug del post type senza bisogno di ulteriori complicazioni: ad esempio, www.miosito/portfolio

Quando lo cambio in archive-portfolio.php, il codice originale di paginate_links non funziona. Mi sto perdendo qualcosa?

Stai facendo riferimento alla query principale, quindi è probabile che stia cercando di mostrare solo i 'post', anziché il tuo custom post type.
Non sono sicuro del tuo formato esatto, ma rifarei la query in questo modo -
$args = Array( // Array di argomenti per query_posts()
'numberposts' => -1,
'posts_per_page' => get_option('posts_per_page'),
'paged' => $paged,
'post_type' => array('il-tuo-slug-post-type', 'un-altro-slug-post-type-se-vuoi')
);
query_posts($args);
Questo significa che il tuo codice diventerebbe -
<?php
global $wp_query; // Non ti serve questo se non sei in una funzione, quindi probabilmente può essere rimosso.
$args = Array( // Array di argomenti per query_posts()
'numberposts' => -1,
'posts_per_page' => get_option('posts_per_page'),
'paged' => $paged,
'post_type' => array('il-tuo-slug-post-type', 'un-altro-slug-post-type-se-vuoi')
);
query_posts($args);
$big = 999999999; // serve un numero improbabile
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 )
);
?>

Questo è un problema con cui mi sono scontrato molte volte.
Ecco cosa ha funzionato per me in questa situazione (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();
//qualsiasi output tu richieda, come ad esempio:
the_excerpt();
endwhile;
endif;
?>
Poi, per i controlli di impaginazione:
<?php
echo custom_paginate_links(
array(
'format' => '?paged=%#%',
'current' => max( 1, get_query_var( 'paged' ) ),
'total' => $loop->max_num_pages
) );
?>

Sarebbe meglio creare una funzione all'interno del file functions.php che gestisca la paginazione e possa essere utilizzata in tutto il tuo tema, sia per i post standard che per i tipi di post personalizzati.
Con la seguente funzione, inserendo get_pagination()
nel tuo tema, otterrai una navigazione ovunque ne abbia bisogno. Ho scritto un post sul blog a riguardo qui: http://deadlyhifi.com/2011/06/non-bloated-pagination-for-your-wordpress-functions-php-file/ (e il codice si basa originariamente su http://robertbasic.com/blog/wordpress-paging-navigation/)
/**
* Una funzione per la paginazione
* @param integer $range: L'intervallo dello slider, funziona meglio con numeri pari
* Funzioni WP utilizzate:
* get_pagenum_link($i) - crea il link, es. http://site.com/page/4
* previous_posts_link(' ‚ '); - restituisce il link alla pagina precedente
* next_posts_link(' é '); - restituisce il link alla pagina successiva
* http://robertbasic.com/blog/wordpress-paging-navigation/
* modificato da tdB ...
*/
function get_pagination($range = 4) {
global $paged, $wp_query;
// Quante pagine abbiamo?
if ( !$max_page ) {
$max_page = $wp_query->max_num_pages;
}
// Abbiamo bisogno della paginazione solo se ci sono più di 1 pagina
if ( $max_page > 1 ) {
if ( !$paged ) $paged = 1;
echo '<div class="postpagination">';
// Pagina precedente
previous_posts_link('Prec');
if ( $paged >= $range ) echo '<a href="' . get_pagenum_link(1) . '">1</a>';
if ( $paged >= ($range + 1) ) echo '<span class="page-numbers">…</span>';
// Abbiamo bisogno dell'effetto di scorrimento solo se ci sono più pagine dell'intervallo
if ( $max_page > $range ) {
// Quando siamo vicini all'inizio
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>';
}
// Quando siamo vicini alla fine
} 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>';
}
// Nel mezzo
} 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>';
}
}
// Meno pagine dell'intervallo, non serve l'effetto di scorrimento
} 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>';
}
}
// Sull'ultima pagina, non mostrare il link all'ultima pagina
if ( $paged <= $max_page - ($range - 1) ) echo '<span class="page-numbers">…</span><a href="' . get_pagenum_link($max_page) . '">' . $max_page . '</a>';
// Pagina successiva
next_posts_link('Succ');
echo '</div><!-- postpagination -->';
}
}

Non ho mai avuto problemi nell'utilizzare la paginazione su un archivio personalizzato.
Quindi, invece di creare una pagina e poi scrivere la mia query personalizzata, basta copiare/incollare archive.php
e rinominarlo per abbinarlo al tuo custom post, ad esempio archive-video.php
.
Se vuoi davvero utilizzare un template di pagina personalizzato, aggiungi questo codice appena prima della tua query:
query_posts( array( 'post_type' => 'video', 'paged' => get_query_var('page') ) )
Maggiori informazioni: http://scribu.net/wordpress/wp-pagenavi/right-way-to-use-query_posts.html
