web-dev-qa-db-ja.com

WP_Queryが取得する投稿数を制限する方法

私はグーグルとWPSEについて研究してきました、そして私が繰り返し見る唯一のことはshowpostsを使うことです、それは非推奨です。

私はWP_Queryに精通しています、そして私がposts_per_pageを私の限界(すなわち5)に設定し、そしてnopagingtrueに設定するならば、それは " OK、私はあなたに5つの投稿しか与えない 。しかしこれはうまくいきません。

enter image description here

これどうやってするの?

23
EliasNS

今あなたが何をしようとしているのか理解できたと思います。 WP_Queryを使用してカスタムクエリを実行し、ページごとに5つの投稿のみを取得するように制限を設定すると、クエリによって5つの投稿のみが取得され、そのクエリは5つの投稿のみを保持しますBUTページネーションのため、WP_Queryは引き続きデータベース全体を実行し、クエリの条件に一致するすべての投稿をカウントします。

これは、クエリの$found_postsおよび$max_num_pagesプロパティを見るとわかります。例を見てみましょう。

デフォルトの投稿タイプpostに属する20の投稿があります。 のみページネーションなしの最新の5つの投稿が必要です。クエリは次のようになります

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts )は、期待どおりに最新の5つの投稿を提供します
  • echo $q->found_posts20を提供します
  • echo $q->max_num_pages4を提供します

この余分な作業の影響は、投稿数が少ないサイトでは最小限ですが、数百または数千の投稿があるサイトを運営している場合は、これによりコストが高くなる可能性があります。 5つの最新の投稿だけが必要な場合、これはリソースの無駄です。

no_found_rowsと呼ばれる文書化されていないパラメーターがあります。これは、必要な5つの投稿が見つかった後にクエリを保釈するために使用できるブール値を使用します。これにより、WP_Queryは、クエリされた投稿の量を取得した後、基準を満たす他の投稿を検索しなくなります。このパラメーターは既にget_postsに組み込まれているため、get_postsWP_Queryを使用していますが、get_postsWP_Queryよりも少し高速です。

結論

結論として、クエリでページネーションを使用しない場合は、クエリの'no_found_rows=true'を使用するのが賢明です。

42
Pieter Goosen

@ user1750063がコードを言及したことを私は知っていますが、これを試してください

$args = array (
    'post_type'              => 'custom_post',
    'nopaging'               => false,
    'posts_per_page'         => '5',
    'order'                  => 'DESC',
    'orderby'                => 'ID',
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // display content
    }
} else {
    // display when no posts found
}

wp_reset_postdata();     // Restore original Post Data
2
Shreyo Gi

質問のコメントについて@Pieter Goosenと会話した後、私は質問に答えて間違いを説明できると思います。

重要なのは、found_postsが私を混乱させていたということです。その数は検索された投稿ですがそうではないと思います。 基準に一致する投稿の数です WP_Queryには2つの部分があります。1つは(すべての)投稿を見つけるためのもので、もう1つはpaginationパラメータをチェックするときにコンテンツを取得するためのものです。つまり、取得された投稿数である$post_countプロパティがあり(CodexによるとThe number of posts being displayed)、もちろんposts_per_pageパラメータの数、および$posts配列プロパティの項目数に等しくなります。

だから私は思ったようにWP_Queryは無駄な仕事をしていません^^

これが他の人に役立つことを願っています!

2
EliasNS

わかりました。「blog_posts」という投稿タイプを使用でき、その投稿タイプの5つの投稿を取得できます。ここにあなたがする必要があるものがあります

$args = array(
        'post_type' => 'blog_posts',
        'posts_per_page' => '5',
);


$query = new WP_Query($args);

上記のクエリは、カスタム投稿タイプでない場合、タイプ 'blog_posts'の5つの投稿を返します。すべての投稿を取得し、この'post_type' => 'posts',のように置き換える場合は、この'posts_per_page' => '-1',のように置き換えます。詳細 WPクエリ

1
shuvroMithun