web-dev-qa-db-fra.com

La pagination montre 404 après un certain nombre de pages

Ce problème est dans mon index.php (bien que je pense plutôt à déplacer ce code vers home.php). J'ai un WP_Query personnalisé qui affiche quelques publications par page, spécifiant des types de publication (j'ai un type personnalisé que la requête principale n'a pas pu afficher). J'ai 42 messages ATM (c'est l'unité de thème Wordpress plus quelque chose que j'ai écrit plus tôt) et j'ai mis 3 messages par page, ce qui signifie que je devrais avoir 15 pages. Mais à partir de la 6ème page et en avant, je reçois une erreur 404.

Code dans index.php

<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

$args = array(
   'posts_per_page' => 3,
   'paged' => $paged,
   'post_type' => array('post', 'blog_post'),
);

$query = new WP_Query($args); ?>
<?php echo $query->max_num_pages ?>
<?php while ( $query->have_posts() ) : $query->the_post() ?>

<section class="article-container col-md-12">

<?php if (has_post_thumbnail()) the_post_thumbnail("post-thumbnail", array('class' => 'img-responsive col-md-5')); ?>
<article class="col-md-7">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<?php the_excerpt(); ?>
<a href="<?php the_permalink(); ?>" class="article-read-more">LEGGI TUTTO</a>
</article>
</section>
<?php endwhile;  ?>
<?php wp_reset_postdata(); ?>

<?php if (function_exists("pagination")) {
    pagination($query->max_num_pages);
} ?>

Fonction de pagination (je l'ai personnalisée car je voulais mon balisage)

function pagination($pages = '', $range = 4) {  
     $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 '<section class="text-center">';
         echo '<ul class="pagination">';

         if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<li><a href='".get_pagenum_link(1)."'>&laquo; First</a></li>";
         if($paged > 1 && $showitems < $pages) echo "<li><a href='".get_pagenum_link($paged - 1)."'>&lsaquo; Previous</a></li>";

         for ($i=1; $i <= $pages; $i++) {
             if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems )) {
                 echo ($paged == $i)? "<li class=\"active\"><a href=\"#\">".$i."</a></li>":"<li><a href='".get_pagenum_link($i)."'>".$i."</a></li>";
             }
         }

         if ($paged < $pages && $showitems < $pages) echo "<li><a href=\"".get_pagenum_link($paged + 1)."\">Next &rsaquo;</a></li>";  
         if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<li><a href='".get_pagenum_link($pages)."'>Last &raquo;</a></li>";

         echo "</ul>";
         echo "</section>";
     }
}

Donc, considérant que je ne peux pas utiliser la requête principale telle quelle et une solution avec elle ne s'applique pas, que puis-je faire? Toute aide serait appréciée.

2
Daniele Squalo

Le problème est que WordPress exécute la requête principale avant votre requête personnalisée (et la requête principale est basée sur le type de publication par défaut uniquement).

Vous pouvez intercepter la requête principale, la modifier, puis l’utiliser comme

function add_blog_post_to_query( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'post_type', array('post', 'blog_post') );
        $query->set( 'posts_per_page', 3 );
    }
}
add_action( 'pre_get_posts', 'add_blog_post_to_query' );

Ensuite, si vous souhaitez toujours utiliser votre fonction personnalisée pagination, vous l’appellerez ainsi.

if ( function_exists( 'pagination' ) ) {
    global $wp_query;
    pagination( $wp_query->max_num_pages );
}

Maintenant, au lieu d'utiliser votre requête personnalisée, vous pouvez utiliser les fonctions standard comme ceci:

if ( have_posts() ) :

    /* Start the Loop */
    while ( have_posts() ) : the_post();

        // your markup here

    endwhile;

else :

    // no posts found

endif;
3
Jared Cobb