WordPress : Paginer une WP_Query

Ceci est un code plutôt simple pour créer une requête personnalisée et la paginer sous WordPress.

WordPress propose deux types de contenus principaux : les posts (articles) et les pages. Si l’on décide de mettre les articles sur une page dédiée (par exemple : page-blog.php), on va devoir récupérer les articles manuellement.

Cela se fait sans douleur avec WordPress :

<div class="articles">
<?php 
$args = [
    'post_type'=>'post',
    'posts_per_page'=>5,
    'paged'=>$paged ?? null
];
$the_query = new WP_Query( $args );

if($the_query->have_posts()) {
    
    while ($the_query->have_posts()) {
        $the_query->the_post();
        ?>
        <div class="article">
            <h1 class="title">
                <?= get_the_title() ?>
            </h1>
            <div class="excerpt">
                <?= get_the_excerpt() ?>
            </div>
            <div class="btn-container">
                <a class="btn-alt" href="<?= get_the_permalink(); ?>">
                    <i class="fa fa-arrow-circle-right"></i> Lire la suite
                </a>
            </div>
        </div>

        <?php
    }

    set_query_var( 'query', $the_query );
    echo get_template_part('parts/pagination');

} else {
    // no posts found
}

/* Restore original Post Data */
wp_reset_postdata();

set_query_var permet de définir query avec $the_query (qui est donc la requête personnalisée. La requête personnalisée sera ainsi reprise par le code qui s’occupe de générer le pagination :

<div class="pagination">
    <?php 
        $settings = [
            'base'         => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ),
            'current'      => max( 1, get_query_var( 'paged' ) ),
            'format'       => '?paged=%#%',
            'show_all'     => false,
            'type'         => 'plain',
            'end_size'     => 2,
            'mid_size'     => 1,
            'prev_next'    => false,
            'prev_text'    => sprintf( '<i></i> %1$s', __( 'Newer Posts', 'text-domain' ) ),
            'next_text'    => sprintf( '%1$s <i></i>', __( 'Older Posts', 'text-domain' ) ),
            'add_args'     => false,
            'add_fragment' => ''
        ];

        if(!empty($query)){
            $settings['total'] = $query->max_num_pages;
        }

        echo paginate_links($settings);
    ?>
</div>

Voilà comme vous pouvez le voir faire une requête personnalisée sous WordPress et la paginer ce n’est pas bien compliqué. Ne pas oublier le paramètre paged dans les arguments de la requête (pour savoir sur quelle page on se trouve) ainsi que d’utiliser set_query_var pour redefinir $query avec la requête personnalisée avant d’inclure le code qui génère la pagination. Ne pas oublier non plus d’utiliser wp_reset_postdata() à la fin de l’opération.

Très bonne journée à vous.