web-dev-qa-db-fra.com

La pagination avec WP_Query is boguée - fonctionne pour certaines pages, mais pour les autres

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)."'>&laquo;</a>";
     if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo;</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)."'>&rsaquo;</a>";  
     if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>&raquo;</a>";
     echo "</div>\n";
 }
}
4
dashaluna

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.

  1. Requêtes WordPress 1-10, votre modèle de requêtes 1-4
  2. Requêtes WordPress 11-20, votre modèle de requêtes 5-8
  3. Requêtes WordPress 21-30, vos requêtes de modèles 9-12
  4. Requêtes WordPress 31-40, vos requêtes de modèles 13-16
  5. WordPress interroge 41-50, mais n'obtient aucun résultat, il en donne donc 404. Votre modèle ne se charge pas.

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 );
    }
}
6
Jan Fabry

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;
  }
}
1
dashaluna