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


25

私はGoogleとWPSEについて調査してきましたが、繰り返し使用showpostsしているのは非推奨のを使用することだけです。

私は精通していますWP_Query、と私は私が設定している場合と思ったposts_per_page私の限界(すなわち。5)、およびにnopagingするtrue、それが「のようなものになるだろう[OK]を、私はあなたにあげるだけで5ポスト」。しかし、これは機能しません。

ここに画像の説明を入力してください

これどうやってするの?


ちょうど'posts_per_page=5'
ピーターグーセン

私はそれを使用しますが、すべての投稿が見つかりました。found_postsプロパティにアクセスすると、5より大きい数値が表示されます。クエリに5つの投稿のみを保持するようにします。出来ますか?@PieterGoosen
EliasNS

あなたは設定しないでくださいnopaging本当の意味を取得することを設定し、パラメータを全ての記事
ピーター・グーセン

@PieterGoosen nopagingパラメータを設定しない場合、デフォルトのが取得されるfalseため、フロントページには5つの投稿が表示されますが、クエリにはさらに多くの投稿が含まれます。質問に画像を追加します。
エリアスNS

コメントがわかりにくいため、ページに表示される投稿の量を5に制限するように求めました。さて、あなたは言う(以前のコメントを読み直してください:-))クエリはより多くを保持します。説明してください。posts_per_pageを設定してから、同じクエリでno_pagingをtrueに設定することはできません。posts_per_page または nopagingをtrueに設定します
Pieter Goosen

回答:


43

今あなたが何をしようとしているのか理解できたと思います。あなたが持つカスタムクエリを実行するとWP_Query、ページあたりわずか5ポストを得るために上限を設定し、唯一の5ポストは、クエリによって取得され、そのクエリは、わずか5つのポストを開催します、しかしページネーションのために、WP_Queryまだ全体のデータベースを介して実行されますクエリの条件に一致するすべての投稿をカウントします。

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

デフォルトの投稿タイプに属する20の投稿がありますpost。あなたは唯一の改ページせずに、最新の5ポストを必要としています。クエリは次のようになります

$q = new WP_Query( 'posts_per_page=5' );
  • var_dump( $q->posts ) 予想通り最新の5つの投稿を提供します
  • echo $q->found_posts あなたにあげます 20
  • echo $q->max_num_pages あなたにあげます 4

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

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

結論

結論として、クエリでページネーションを使用しない場合は、クエリ内で'no_found_rows=true'物事を高速化し、リソースの浪費を節約することが常に賢明です。


3

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

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

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

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


私の答えをご覧ください。私はあなたの意味を理解していると思います:-)
ピーター・グーセン

はい!あなたはそれを非常にうまくやった:D最後に私はそれをする方法を得た、そしてすべての= Dを理解する@PieterGoosenに感謝!
エリアス

できた!私自身の答えを拡張しました^^ @PieterGoosen
EliasNS

1

OK、「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 Query


質問に対するコメントをご覧ください。
エリアスNS

1

@ 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

id無効とされているorderby値とpagination無効なパラメータである
ピーターグーセン

pagination有効なパラメーターではありません。という意味'nopaging' => trueですか?はいの場合、すべての投稿を取得します。それは私が望むものではありません。@PieterGoosen私は彼が意味すると思いますID
エリアスNS

orderbyは注文を表示するためのものです。nopaging値/パラメーターに害を与えることはありません。@PieterGoosenなぜIDとorderbyが無効なのですか?ポイントを明確にできますか?
シュリーヨギ

それはあるべきIDではないid
ピーター・グーセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.