J'ai un bogue très particulier avec la pagination :( J'essaye d'afficher 4 posts par page pour une catégorie avec slug "lastest-news".
La fonction de pagination semble fonctionner correctement. Il y a 33 postes. La pagination est construite correctement avec 9 pages et des liens de format suivant:/category/lastest-news/page //
La chose intéressante est que cela fonctionne correctement (affichage de 4 messages par page) à partir de la page 1-4, y compris. Cependant, pour les pages 5 à 9, cela ne fonctionne pas du tout. Cela ne semble même pas servir le modèle ... la seule erreur que j'ai pu remarquer est celle de la page disant "Rien trouvé pour la catégorie Dernières nouvelles".
Je comprendrais si cela ne fonctionnait pas du tout, mais au hasard 4 pages et pas plus?
J'apprécierais vraiment vraiment toute aide! J'ai passé plus de 4 heures à essayer de comprendre ce qui ne va pas et ça me dérange.
Merci pour l'aide :)
J'utilise le code suivant pour la requête:
<?php
$page = get_query_var('paged');
$posts_on_page = new WP_Query("posts_per_page=4&category_name=lastest-news&paged=".$page);
//loop to display every one of 4 posts
//pagination
pagination($posts_on_page->max_num_pages);
?>
J'utilise la fonction de pagination de cet article: http://www.kriesi.at/archives/how-to-build-a-wordpress-post-pagination-without-plugin
Voici la fonction (qui semble bien fonctionner):
function pagination($pages = '', $range = 2){
$showitems = ($range * 2)+1;
global $paged;
if(empty($paged)) $paged = 1;
if($pages == '')
{
global $wp_query;
$pages = $wp_query->max_num_pages;
if(!$pages)
{
$pages = 1;
}
}
if(1 != $pages)
{
echo "<div class='pagination'>";
if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>«</a>";
if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>‹</a>";
for ($i=1; $i <= $pages; $i++)
{
if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
{
echo ($paged == $i)? "<span class='current'>".$i."</span>":"<a href='".get_pagenum_link($i)."' class='inactive' >".$i."</a>";
}
}
if ($paged < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($paged + 1)."'>›</a>";
if ($paged < $pages-1 && $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>»</a>";
echo "</div>\n";
}
}
WordPress fait sa propre requête sur chaque page. Vous devriez modifier cette requête au lieu d'en créer une nouvelle. Ce qui se passe maintenant, c’est que WordPress fait une requête avec les posts standard par page de 10, mais vous ne faites rien avec ces résultats et faites votre propre requête. Cela fonctionne ... jusqu'à ce que WordPress aille au-delà du post 33, qui se trouve à la page 4.
Vous devez donc plutôt modifier la requête standard que WordPress exécutera en la plaçant dans votre functions.php
ou dans un plugin:
add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
if ( $wp_query->is_category && 'latest-news' == $wp_query->get_queried_object()->slug ) {
$wp_query->set( 'posts_per_page', 4 );
}
}
Basé sur la réponse de @Jan Fabry, j'ai un peu modifié la syntaxe. Ça marche bien. Merci Jan pour l'explication !!!
add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
if ($wp_query->query_vars['category_name'] == 'latest-news'){
$wp_query->query_vars['posts_per_page'] = 4;
}
}