web-dev-qa-db-fra.com

404 erreur non trouvée sur la pagination

Message normal (pas de type de message personnalisé), j’ai fait tout ce que je devais faire, mais 404 erreur non trouvée dans la pagination. Voici mon code

$category_id = get_query_var('cat'); //Using this to get category ID to meet some special requirements
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $args = array(
            'posts_per_page' => 4,
            'numberposts'    => 50,
            'paged' => $paged,
            'cat' => $category_id
        );

        query_posts($args);
        if ( have_posts() ) : while ( have_posts() ) : the_post(); 
        $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );
        ?>
        <div id="post-item">
        <div class="thumb"><img src="<?php echo get_stylesheet_directory_uri(); ?>/timthumb.php?src=<?php echo $image[0]; ?>&w=224&h=224&zc=1" /></div>

        <div class="detail">
            <h2 class="wrtitle"><span class="blue"><?php  $category = get_the_category(); echo $category[0]->cat_name; ?> : </span><?php the_title(); ?></h2>
            <div class="date"><?php the_date(); ?></div>
            <div class="excerpt"><?php the_excerpt(); ?></div>
        </div>
        <div class="rmore"><a href="<?php the_permalink(); ?>"><img src="<?php echo get_stylesheet_directory_uri(); ?>/images/readmore.png" /></a></div>
        </div>
        <?php endwhile; 
        wp_reset_postdata();
        else: ?>
     <p><?php _e('No posts found'); ?></p>

    <?php endif; ?>

    <!-- Pagination Part -->
    <div id="pagination">
        <div class="next"><?php next_posts_link('next &raquo;') ?></div>
        <div class="prev"><?php previous_posts_link('&laquo; previous') ?></div>
    </div>

J'ai besoin de votre suggestion.

1
IFightCode

Placez votre code dans le fichier modèle category.php.

Supprimez toute la partie avant la boucle: une fois dans le modèle de catégorie, vous n'avez pas besoin d'obtenir la catégorie, obtenir le paginé, réexécutez la requête avec query_posts...

Donc, votre category.php devrait simplement apparaître comme suit:

if ( have_posts() ) : while ( have_posts() ) : the_post(); 
  $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );
?>

... post markup here

<?php endwhile; 

else: ?>

<p><?php _e('No posts found'); ?></p>

<?php endif; ?>

<!-- Pagination Part -->
<div id="pagination">
  <div class="next"><?php next_posts_link('next &raquo;') ?></div>
  <div class="prev"><?php previous_posts_link('&laquo; previous') ?></div>
</div>

Pour forcer ce modèle à afficher uniquement 4 hôtes par page, dans functions.php, utilisez:

add_action('pre_get_posts','four_post_per_cat');

function four_post_per_cat( $query ) {
  if ( ! is_admin() && is_main_query() && is_category() ) {
    $query->set('posts_per_page', 4);
  }
}

Après cela, numberposts et posts_per_page sont des synonymes, mais numberposts est obsolète. Si vous définissez des valeurs différentes pour elles, numberposts ne fait rien (ou posts_per_page ne fait rien, je ne me souviens plus ... mais utilisez l'une d'elles).

Si votre portée limite le nombre total de publications atteintes (dans toutes les pages), utilisez le filtre post_limit , dans functions.php ajoutez également:

add_filter( 'post_limits', 'cat_post_limits' );

function cat_post_limits( limit ) {
    return ( is_category() ) ? 'LIMIT 0, 50' : $limit;
}

En suivant mes conseils, non seulement vous résoudrez votre problème, mais vous améliorerez également les performances: car query_posts est très mauvais en termes de performances: ne l'utilisez jamais.


Une note : si vous avez ajouté une règle de réécriture, veillez à vider les règles. Dans votre tableau de bord, accédez à Paramètres -> Permaliens et cliquez sur "Enregistrer les modifications".


PS: Si vous obtenez au maximum 50 messages, 50 n'est pas divisible par 4, la dernière page comportera donc 2 messages. Pourquoi ne pas définir la limite à 52 ou 48?

2
gmazzap