J'utilise la requête suivante pour un type d'article personnalisé:
<?php
$posts = get_posts(array(
'numberposts' => -1,
'offset' => 20,
'post_type' => 'faqs'
));
if($posts)
{
foreach($posts as $post)
{
echo '<li class="faq">
<p class="title"><a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></p></li>';
/*<h4 class="title"><a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></h4><p>' . get_the_excerpt($post->ID) . '</p></li>'; */
}
}
wp_reset_query();
?>
Y a-t-il une raison pour laquelle le paramètre offset ne fonctionne pas? Peut-être dois-je écrire une requête totalement différente?
La raison de ce comportement est assez simple. Tout d’abord, vous devez savoir que get_posts
utilise WP_Query
pour obtenir des publications.
Alors regardons l'implémentation de WP_Query. Sur ligne 1998 de query.php vous pouvez trouver:
if ( $q['posts_per_page'] == -1 ) {
$q['nopaging'] = true;
Ensuite, sur ligne 2544 de query.php vous trouvez:
if ( empty($q['nopaging']) && !$this->is_singular ) {
$page = absint($q['paged']);
if ( !$page )
$page = 1;
if ( empty($q['offset']) ) {
$pgstrt = ($page - 1) * $q['posts_per_page'] . ', ';
} else { // we're ignoring $page and using 'offset'
$q['offset'] = absint($q['offset']);
$pgstrt = $q['offset'] . ', ';
}
$limits = 'LIMIT ' . $pgstrt . $q['posts_per_page'];
}
C'est la seule partie où LIMIT pour les posts est ajouté. Et, comme vous pouvez le constater, il n’est ajouté que si nopaging
n’est pas défini. Donc, si posts_per_page
est défini sur -1, la partie de pagination de la requête SQL n'est pas ajoutée.
Alors, que pouvez-vous faire pour y remédier? Vous pouvez définir numberofposts
sur un grand nombre positif.
Définissez la valeur 'nombre d'affichage' sur un grand nombre positif. Avec numberposts défini sur -1, toutes les questions posées seront ignorées, en ignorant la valeur de décalage.