web-dev-qa-db-fra.com

Faites en sorte que la pagination (WP-PageNavi) ne fonctionne pas

J'ai plusieurs problèmes pour obtenir le travail de pagination.

J'ai un modèle de page personnalisé, il me faut afficher tous les articles du blog. Je construis la "requête" suivante et construis ma structure HTML:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array( 
    'post_type'         => 'post',
    'orderby'           => 'date',
    'order'             => 'DESC',
    'post_status'       => 'publish',
    'posts_per_page'    => 5,
    'paged'             => $paged,
);
$posts = get_posts( $args );

if ( ! empty( $posts ) && ! is_wp_error( $posts )) {
   $displaylist = '<div class="list-group">';

    foreach ( $posts as $post ) {
        /* loop stuff */
    }

    $displaylist .= '</div>';

    echo( $displaylist );
    wp_pagenavi( array( 'type' => 'multipart' ) );
}

avec cela, je reçois les posts comme je l’attendais mais pas les contrôles de pagination.

Remarque: ce n'est pas la page "principale", c'est une sous-page.

Après des recherches, je remarque que de nombreuses personnes l'utilisent:

$posts = new WP_Query( $args );

au lieu de cela:

$posts = get_posts( $args );

si j'utilise la WP_Query($args), je reçois de nombreux messages vides alors que je n'ai que 3 messages.

Je n'ai aucune idée de ce que je fais de mal, mais je suis un débutant pour WordPress et PHP.

1
Manu Zi

Quelques problèmes ici;

  • N'utilisez pas get_posts pour les requêtes paginées. Il rompt/ignore légalement la pagination en passant de no_found_rows=true à WP_Query. De plus, get_posts renvoie uniquement la propriété $posts à partir de l'objet de requête et la pagination a besoin d'autres propriétés de l'objet de requête pour calculer la pagination. Vous pouvez paginer get_posts, mais c'est une affaire très compliquée, et get_postsis just a wrapper function forWP_Query`.

  • N'utilisez pas la variable globale $posts ( ni aucune autre variable globale dans Wordpress ou PHP ) en tant que variable personnalisée. Cela casse les variables globales lorsque vous affectez un contenu différent à la variable. Il s'agit du problème le plus probable qui provoque les résultats incohérents de votre requête avec WP_Query. Toujours utiliser des variables personnalisées. La seule exception à cela est lorsque vous utilisez setup_postdata( $post ) avec get_posts ou des fonctions similaires, setup_postdata() nécessite l'utilisation de $post global. Ici, vous devez vous rappeler d’utiliser wp_reset_postdata() une fois que vous avez terminé pour restaurer le $post global.

  • Lorsque vous utilisez get_posts, vous n'avez pas besoin de rechercher un objet WP_Error car get_posts renvoie uniquement un tableau de publications ou un tableau vide. Il ne retournera jamais un objet WP_Error

Vous devriez essayer ce qui suit:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array( 
    'post_type'         => 'post',
    'orderby'           => 'date',
    'order'             => 'DESC',
    'post_status'       => 'publish',
    'posts_per_page'    => 5,
    'paged'             => $paged,
);
$q = new WP_Query( $args ),

if ( $q->have_posts() ) {

    $displaylist = '<div class="list-group">';

    while ( $q->have_posts() ) {
    $q->the_post();

        // LOOP STUFF HERE

    } // endwhile

    $displaylist .= '</div>';

    wp_pagenavi( array( 'query' => $q ) );

    wp_reset_postdata(); // VERY VERY IMPORTANT

} // endif
3
Pieter Goosen