web-dev-qa-db-fra.com

Archive page ... limiter le nombre de messages par page

J'ai donc créé un type de message personnalisé 'testimonials' et défini l'option "has archive" sur "true" et un fichier de modèle PHP nommé "archive-testimonials.php".

Ce que je ne veux pas faire, c'est limiter le nombre de messages affichés à 5 avec une option suivante et précédente pour revenir en arrière et avancer vers la prochaine 5. Cela semble assez facile, mais pour une raison quelconque, je ne peux pas le faire fonctionner.

Voici ma boucle qui me montre tous les 17 messages de témoignage:

<?php $loop = new WP_Query( array( 'pagename' => 'testimonials', 'posts_per_page' => -1 ) ); ?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
  <div>
    <h2><?php the_title(); ?></h2>
    <?php the_content(); ?>
   </div>
 <?php endwhile; ?>

Le seul moyen de les afficher tous au lieu de 10 est d'utiliser 'posts_per_page' => -1. Et même sans "posts_per_page", seuls 10 des 17 messages seront affichés.

Maintenant j'ai essayé:

<?php $loop = new WP_Query( array( 'post_type' => 'testimonials', 'posts_per_page' => 5 ) ); ?>
<?php previous_posts_link(); ?> &bull; <?php next_posts_link(); ?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
  <div>
    <h2><?php the_title(); ?></h2>
     <?php the_content(); ?>
  </div>
<?php endwhile; ?>

Je ne peux pas en montrer que cinq, mais je n'ai pas de pagination pour les cinq prochaines. J'ouvre simplement "testimonials/page/2 /" et affiche les mêmes cinq que la page précédente.

Qu'est-ce que je fais mal. Toute aide est grandement appréciée.

Merci

1
agon024

Ne créez pas de nouvelle requête et ne faites pas de boucle pour modifier les publications par page. Ajoutez une fonction liée à pre_get_posts et modifiez les paramètres souhaités avant l’exécution de la requête. Cela irait dans le fichier functions.php de votre thème, ou dans un plugin.

function wpd_testimonials_query( $query ){
    if( ! is_admin()
        && $query->is_post_type_archive( 'testimonials' )
        && $query->is_main_query() ){
            $query->set( 'posts_per_page', 5 );
    }
}
add_action( 'pre_get_posts', 'wpd_testimonials_query' );

Ensuite, dans le modèle, vous exécutez la boucle normale et la pagination fonctionne comme prévu.

8
Milo