Pagination avec WP_Query est bogué - travailler pour certaines pages, mais pas les autres

wordpress.stackexchange https://wordpress.stackexchange.com/questions/7687

  •  16-10-2019
  •  | 
  •  

Question

Je vais avoir un bug très particulière avec :( Je pagination essaie d'afficher 4 messages par page pour une catégorie avec limaces « lastest-nouvelles ».

La fonction semble fonctionner en page correctement. Il y a 33 postes. La pagination se construit correctement avec 9 pages et liens de format suivant: / catégorie / lastest-Nouvelles / page //

La chose intéressante est que cela fonctionne correctement (affichage de 4 messages par page) de la page 1-4, y compris. Cependant, pour les pages 5-9 ne fonctionne pas du tout. Il ne semble même pas servir le modèle ... la seule erreur que je pouvais repérer est de la page disant: « Rien trouvé pour la catégorie Nouvelles-Lastest Page 5 ».

Je comprendrais que cela ne fonctionnera pas du tout, mais pour 4 pages au hasard et non plus?

Je voudrais vraiment vraiment apprécier toute aide! J'ai passé au sujet de plus de 4 heures à essayer de comprendre ce qui ne va pas et il me casser les pieds.

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 ce poste en page: http://www.kriesi.at/archives/how-to-build-a-wordpress-post-pagination-without-plugin

Voici la fonction (ce qui semble fonctionner très bien):

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";
 }
}
Était-ce utile?

La solution

WordPress fait sa propre requête sur chaque page. Vous devez modifier cette requête au lieu de créer un nouveau. Ce qui se passe maintenant est que WordPress fait une requête avec les messages standard par page de 10, mais vous ne faites rien avec ces résultats et faire votre propre requête. Cela fonctionne ... jusqu'à ce que WordPress va au-delà après # 33, qui est sur le numéro de la page 4.

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

Ainsi, au lieu vous devez modifier la requête standard WordPress exécutera, en plaçant dans votre functions.php ou dans un plug-in:

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 );
    }
}

Autres conseils

D'après @Jan Fabry réponse, j'ai changer la syntaxe un peu. Ç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;
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top