web-dev-qa-db-fra.com

Pagination cassée

Eh bien, je suis encore ici avec à peu près le même problème que dans ce post il y a trois semaines , mais laissez-moi vous expliquer ce qui s'est passé depuis:

À l'origine, j'utilisais une boucle pour afficher le dernier post-poster en haut de la page de couverture, puis une seconde boucle pour afficher tous les autres posts (à l'exception de tous les autres post-it). Voici mon code tel qu'il se présente maintenant:

// first loop to display only my single, MOST RECENT sticky post
$sticky = get_option('sticky_posts');
$wp_query = new WP_Query(array('post__in' => $sticky, 'caller_get_posts' => 1, 'orderby' => ID, 'showposts' => 1)); ?>
<?php while (have_posts()) : the_post(); ?>
    <!-- loop code -->
<?php endwhile; wp_reset_query(); ?>

// second loop to display every other post, excluding sticky posts
<?php query_posts(array('post__not_in' => get_option('sticky_posts'))); // exclude all sticky posts ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <!-- loop code -->
<?php endif; wp_reset_query(); ?>

Ce qui se passe ici est parfait ... pour la première page uniquement. Je reçois mon message collant le plus récent et le plus récent au sommet, suivi de 5 autres messages. Malheureusement, si je feuilletais les pages 2, 3, 4, etc., tout ce que je vois sont les mêmes 5 messages qui étaient sous le post collant en première page!

Je suis assez nouveau avec le concept de boucles multiples, donc je pourrais vraiment utiliser un coup de main ici!

Merci d'avance :)

2
user6674

Je vois quelques problèmes qui contribuent probablement à votre problème:

  1. N'utilisez jamais que query_posts() pour modifier la boucle principale.
  2. Le paramètre caller_get_posts est obsolète , en faveur de ignore_sticky_posts
  3. La variable $wp_query est une variable globale définie. Son utilisation en dehors de l'utilisation prévue peut entraîner des circonstances inattendues.

Donc, vous devez d’abord déterminer quelle est votre boucle principale. Je vais supposer que ceci est la secondeboucle.

Deuxièmement, créez un nom descriptif unique pour votre boucle secondaire (c'est-à-dire votre firstloop), tel que $most_recent_sticky_post.

Cela devrait vous laisser avec:

<?php
// Get IDs of sticky posts
$sticky = get_option('sticky_posts');
// first loop to display only my single, 
// MOST RECENT sticky post
$most_recent_sticky_post = new WP_Query( array( 
    // Only sticky posts
    'post__in' => $sticky, 
    // Treat them as sticky posts
    'ignore_sticky_posts' => 0, 
    // Order by ID
    'orderby' => ID, 
    // Get only the one most recent
    'showposts' => 1
) );
while ( $most_recent_sticky_post->have_posts() ) : $most_recent_sticky_post->the_post(); ?>
    <!-- loop code -->
<?php endwhile; wp_reset_query(); ?>

// second loop to display every other post, 
// excluding sticky posts
<?php 
query_posts( array( 
    // exclude all sticky posts
    'post__not_in' => get_option( 'sticky_posts' ) 
) );  
if (have_posts()) : while (have_posts()) : the_post(); ?>
    <!-- loop code -->
<?php endif; wp_reset_query(); ?>

Maintenant, puisque vous ne piétinez plus sur $wp_query, votre pagination devrait fonctionner correctement.

Modifier

Ok, d'autres choses:

  1. Le paramètre showposts est également obsolète. Utilisez post_per_page à la place.
  2. Essayons de faire une fusion de variables de requête pour votre boucle principale.

par exemple.:

// Define custom query args
$custom_query_args = array( 
    // exclude all sticky posts
    'post__not_in' => get_option( 'sticky_posts' ) 
);  
// globalize $wp_query
global $wp_query;
// Merge custom args with default query args
$merged_query_args = array_merge( $wp_query->query, $custom_query_args );
// process the query
query_posts( $merged_query_args );

Je ne sais pas si cela fera une différence, mais je préfère modifier la requête par défaut à l'aide de cette méthode.

  1. Si cela ne fonctionne toujours pas, forcez query_posts() à se rappeler qu'il est censé utiliser la pagination. Ajoutez 'paged' => get_query_var('paged') à votre tableau $custom_query_args:

par exemple.

  // Define custom query args
  $custom_query_args = array( 
      // exclude all sticky posts
      'post__not_in' => get_option( 'sticky_posts' ),
      // don't forget to paginate!
      'paged' => get_query_var('paged')
  );  

Où cela nous mène-t-il?

2
Chip Bennett

Ne devriez-vous pas utiliser des paramètres de pagination dans votre WP_Query

 $posts = new WP_Query( array( /*your args here*/, 'paged' => get_query_var( 'page' ) ) );

Cela pourrait être get_query_var ('paged') en fonction de WP version, je crois.

Paramètres de pagination WP_Query ici

0
Shane