web-dev-qa-db-ja.com

カスタム投稿タイプクエリでのオフセットの使用

カスタム投稿タイプには次のクエリを使用します。

<?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();
            ?>

Offsetパラメータが機能しない理由はありますか?まったく別のクエリをすべて書く必要があるでしょうか。

3
user1860393

この動作の理由はとても簡単です。まず第一に、あなたはget_postsが投稿を得るためにWP_Queryを使うことを知っていなければなりません。

それでは、WP_Queryの実装を見てみましょう。 query.phpの 1998行に があります。

if ( $q['posts_per_page'] == -1 ) {
    $q['nopaging'] = true;

それから 2544行目のquery.php に、あなたは見つけます:

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'];
}

投稿の制限が追加されている唯一の部分です。そしてご覧のとおり、nopagingが設定されていない場合にのみ追加されます。したがって、posts_per_pageが-1に設定されている場合、SQLクエリのページング部分は追加されません。

それであなたはそれを回避するために何ができるでしょうか? numberofpostsを大きな正数に設定することができます。

1

'numberposts'値を大きな正数に設定してください。 numberpostsを-1に設定すると、オフセット値を無視してすべてのFAQを返します。

0
livearoha