web-dev-qa-db-fra.com

Utilisation du décalage dans une requête de type de post personnalisée

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?

3
user1860393

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.

1
Krzysiek Dróżdż

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.

0
livearoha