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.
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 for
WP_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