J'ai créé une page pour mes types de publication personnalisés. Le code peut être consulté sur Snippi: http://snippi.com/s/e8852rx
J'essaie d'insérer paginate_links, mais pour une raison quelconque, il ne s'affiche tout simplement pas. Voici le code paginate_links (ce code fonctionne sur les fichiers archive.php normaux):
<?php
global $wp_query;
$big = 999999999; // need an unlikely integer
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
) );
?>
Ce qui suit fonctionne pour moi (j'ai supprimé toutes les méta de formating/custom post).
J'ajouterais que la raison pour laquelle vous devez utiliser une page avec un modèle personnalisé n'est pas claire et ne créez pas plutôt un modèle appelé archive-portfolio.php
qui est utilisé pour les pages d'archive d'un type de publication personnalisée (voir hiérarchie de modèles )
<?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; // need an unlikely integer
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(); ?>
Avez-vous essayé d'utiliser la page d'archive racine du type de publication de portefeuille?
Si vous déplacez la majeure partie de votre code dans un fichier archive-portfolio.php, la boucle doit être correctement configurée et la pagination doit fonctionner immédiatement, sans fonctions funky, ni hacks, ni kludges, comme dans les archives de publication.
Cela signifie également que vous n'avez pas besoin d'utiliser votre propre requête personnalisée, utilisez simplement la boucle principale à la place, ce qui accélère le chargement de la page.
Au lieu d'utiliser l'approche "$ loop-> have_posts ()", comme l'a souligné Stephen Harris, vous pouvez également essayer de boucler les publications de la manière suivante:
<?php foreach ($loop->get_posts() as $post) { ?>
<span class="title"><?php echo $post->post_title; ?></span></br>
<?php } ?>
Je n'ai jamais eu de problème pour utiliser la pagination sur un archive personnalisé. Ainsi, au lieu de créer une page et d’écrire ensuite ma propre requête, copiez/collez simplement archive.php
et renommez-la afin qu’elle corresponde à votre message personnalisé, par exemple archive-videos.php
.
Si vous voulez vraiment utiliser un modèle de page personnalisé, ajoutez ceci juste avant votre requête:
query_posts( array( 'post_type' => 'videos', 'paged' => get_query_var('page') ) )
Plus d'infos: http://scribu.net/wordpress/wp-pagenavi/right-way-to-use-query_posts.html
Vous êtes en train de référencer la requête principale, il est donc probable qu’elle essaie d’afficher uniquement les "publications", par opposition à votre type de publication personnalisé.
Je ne sais pas quel est votre format exact, mais je refais la requête pour -
$args = Array( // Array of arguments for query_posts()
'numberposts' => -1,
'posts_per_page' => get_option('posts_per_page'),
'paged' => $paged,
'post_type' => array('your-post-type-slug', 'another-post-type-slug-if-you-want')
);
query_posts($args);
Cela signifie que votre code deviendrait -
<?php
global $wp_query; // You don't need this if you are not in a function, so can probably be removed.
$args = Array( // Array of arguments for query_posts()
'numberposts' => -1,
'posts_per_page' => get_option('posts_per_page'),
'paged' => $paged,
'post_type' => array('your-post-type-slug', 'another-post-type-slug-if-you-want')
);
query_posts($args);
$big = 999999999; // need an unlikely integer
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 )
);
?>
C’est un problème avec lequel j’ai lutté à maintes reprises.
Voici ce qui a fonctionné pour moi dans cette situation (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();
//whatever output you require, such as, e.g:
the_excerpt();
endwhile;
endif;
?>
Ensuite, pour les contrôles de pagination:
<?php
echo custom_paginate_links(
array(
'format' => '?paged=%#%',
'current' => max( 1, get_query_var( 'paged' ) ),
'total' => $loop->max_num_pages
) );
?>
Il serait préférable de créer une fonction dans votre fichier functions.php qui gère la pagination et puisse être utilisée dans votre thème, pour les types de publication standard et personnalisés.
Avec la fonction suivante, déposer get_pagination()
dans votre thème vous donnera une navigation où vous en aurez besoin. J'ai écrit un article de blog à ce sujet ici: http://deadlyhifi.com/2011/06/non-bloated-pagination-for-your-word-wordpress-functions-php-file/ (et le code est basé sur http://robertbasic.com/blog/wordpress-paging-navigation/ à l'origine)
/**
* A pagination function
* @param integer $range: The range of the slider, works best with even numbers
* Used WP functions:
* get_pagenum_link($i) - creates the link, e.g. http://site.com/page/4
* previous_posts_link(' ‚ '); - returns the Previous page link
* next_posts_link(' é '); - returns the Next page link
* http://robertbasic.com/blog/wordpress-paging-navigation/
* tweaked by tdB ...
*/
function get_pagination($range = 4) {
global $paged, $wp_query;
// How much pages do we have?
if ( !$max_page ) {
$max_page = $wp_query->max_num_pages;
}
// We need the pagination only if there is more than 1 page
if ( $max_page > 1 ) {
if ( !$paged ) $paged = 1;
echo '<div class="postpagination">';
// To the previous page
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>';
// We need the sliding effect only if there are more pages than is the sliding range
if ( $max_page > $range ) {
// When closer to the beginning
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>';
}
// When closer to the end
} 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>';
}
// Somewhere in the middle
} 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>';
}
}
// Less pages than the range, no sliding effect needed
} 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>';
}
}
// On the last page, don't put the Last page link
if ( $paged <= $max_page - ($range - 1) ) echo '<span class="page-numbers">…</span><a href="' . get_pagenum_link($max_page) . '">' . $max_page . '</a>';
// Next page
next_posts_link('Next');
echo '</div><!-- postpagination -->';
}
}