WP_Queryが取得する投稿の数を制限するにはどうすればよいですか?
-
-
ただ `'posts_per_page=5'`Just `'posts_per_page=5'`
- 0
- 2015-03-18
- Pieter Goosen
-
私はそれを使用しますが、それはすべての投稿を見つけました.`found_posts`プロパティにアクセスすると、5より大きい数値が表示されます.クエリに保持する投稿を5つだけにします.出来ますか?@PieterGoosenI use that, but that found all the posts. If I access to the `found_posts` property, it says a higher number than 5. I want my query to hold only 5 posts. ¿Is it possible? @PieterGoosen
- 0
- 2015-03-18
- EliasNS
-
`nopaging`パラメータを設定しないでください.これをtrueに設定すると、**すべて**の投稿を取得することになります.You should not set the `nopaging` parameter, setting that to true means to get **all** posts
- 0
- 2015-03-18
- Pieter Goosen
-
@PieterGoosen `nopaging`パラメータを設定しない場合、デフォルトの`false`が取得されるため、フロントページには5つの投稿が表示されますが、クエリにはさらに多くの投稿が含まれます.質問に画像を追加します.@PieterGoosen If I don't set the `nopaging` parameter it gets the default that is `false`, so the frontpage shows 5 posts, but the query holds more. I add an image to the question.
- 0
- 2015-03-18
- EliasNS
-
あなたのコメントは紛らわしいです、あなたはページに表示される投稿の量を5に制限するように頼みました、それはあなたが得るものです.さて、あなたは言います(あなたの前のコメントを読み直してください:-))クエリはもっと保持します.説明してください.同じクエリでposts_per_pageを設定してからno_pagingをtrueに設定することはできません.posts_per_page**または**nopagingをtrueに設定してください.Your comments are confusing, you asked to limit the amount of posts shown on a page to 5, that is what you get. Now, you say (reread your previous comment :-)) the query holds more. Please explain. You cannot set posts_per_page and then use no_paging set to true in the same query, it is either posts_per_page **OR** nopaging set to true
- 0
- 2015-03-18
- Pieter Goosen
-
私の質問は「得る」と言っています.クエリに表示されている投稿よりも多くの投稿が含まれている場合、必要以上の作業を行っていると思います.それを回避できるかどうか知りたいだけです.非表示のナビゲーションでナビゲート可能な結果が必要ありません.My question says "gets". I think that if the query holds more posts that the shown ones, it is doing more work than needed. I just want to know if it is possible to avoid that. I don't want navigable results with a hidden navigation.
- 0
- 2015-03-18
- EliasNS
-
クエリは、あなたが要求したそれ以上の投稿を保持しません.5つを要求した場合、要件に一致する投稿が5つ以上あると、5つの投稿が取得されます.クエリの `var_dump()`を実行します.たとえば、クエリ変数が `$ query`の場合は、` var_dump($ query->posts) `を実行します.クエリした5つの投稿のみが表示されますThe query will not hold more posts that you have asked for. If you ask for 5, 5 posts will be retrieved if there is more than 5 posts that matches the requirements. Do a `var_dump()` of your query, like if your query variable is `$query`, do `var_dump( $query->posts )`. You will only see the 5 posts you queried for
- 0
- 2015-03-18
- Pieter Goosen
-
5 回答
- 投票
-
- 2015-03-18
あなたがやろうとしていることを理解できたと思います.
WP_Query
を使用してカスタムクエリを実行し、ページごとに5件の投稿のみを取得するように制限を設定すると、クエリによって取得される投稿は5件のみになり、そのクエリは5件の投稿のみを保持します.ただしページ付けのために、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_posts
は20
を提供します
-
echo $ q->max_num_pages
は4
を提供します
この余分な作業の影響は、投稿数が少ないサイトでは最小限ですが、投稿数が数百または数千のサイトを運営している場合、これは高額になる可能性があります.最新の5つの投稿だけが必要になる場合、これはリソースの浪費です.
no_found_rows
と呼ばれる文書化されていないパラメータがあります.これは、必要な5つの投稿が見つかった後にクエリをベイルするために使用できるブール値を使用します.これにより、WP_Query
は、クエリされた投稿の量を取得した後、基準に一致する投稿をこれ以上検索しなくなります.このパラメーターはすでにget_posts
に組み込まれているため、get_posts
はget_posts
を使用しますが、WP_Query
よりも少し高速です. code> WP_Query結論
結論として、クエリでページネーションを使用しない場合は、クエリで
'no_found_rows=true'
を使用して処理を高速化し、リソースの浪費を節約します.I think that now I understand what you are trying to do. When you run a custom query with
WP_Query
and set the limit to get only 5 posts per page, only 5 posts will be retrieved by the query and that query will only hold 5 posts, BUT for the sake of pagination,WP_Query
still runs through the whole database and counts all the posts that matches the criteria of the query.That can be seen when you look at the
$found_posts
and$max_num_pages
properties of the query. Lets take an example:You have 20 posts belonging to the default post type
post
. You only need the latest 5 posts without pagination. Your query looks like this$q = new WP_Query( 'posts_per_page=5' );
var_dump( $q->posts )
will give you the latest 5 posts as expectedecho $q->found_posts
will give you20
echo $q->max_num_pages
will give you4
The impact of this extra work is minimal on sites with only a few posts, but this can gt expensive if you are running a site with hundreds or thousands of posts. This is a waste of resources if you are only ever going to need the 5 latest posts
There is an undocumented parameter called
no_found_rows
which uses boolean values which you can use to make your query bail after it found the 5 posts you need. This will forceWP_Query
not to look for any more posts mathing the criteria after it has retrieved the amount of posts queried. This parameter is already build intoget_posts
, that is whyget_posts
is a bit faster thanWP_Query
althoughget_posts
usesWP_Query
Conclusion
In conclusion, if you are not going to use pagination on a query, it is always wise to
'no_found_rows=true'
in your query to speed things up and to save on wasting resources. -
- 2015-03-18
質問のコメントについて@PieterGoosenと会話した後、質問に答えて間違いを説明できると思います.
重要なのは、
found_posts
が私を混乱させていたということです.その数は取得された投稿ですが、そうではないと思います.条件に一致する投稿の数です.WP_Query
には2つの部分があるようです.1つは(すべての)投稿を検索するためのもので、もう1つはpagination
パラメータをチェックするときにコンテンツをフェッチするためのものです.したがって、フェッチされた投稿の数である$post_count
プロパティがあります(Codexは表示されている投稿の数
と言います)、もちろんそれはposts_per_page
パラメータ、および$posts
配列プロパティのアイテム数.つまり、
WP_Query
は、私が思っていたように、無駄な作業を行っていません^^これが他の人に役立つことを願っています!
After the conversation with @Pieter Goosen on the comments of the question, I think I can answer the question and explain my mistake.
The key is that
found_posts
was confussing me. I thougth that, that number is the posts retrieved but is not. It is the number of posts that match the criteria. It's like theWP_Query
had 2 parts: one for finding (all) the posts, and other for fetching the content, when it checks for thepagination
parameters. So we have the$post_count
property that is the number of posts fetched (Codex saysThe number of posts being displayed
), that of course is equal to the number onposts_per_page
parameter, and the number of items on the$posts
array property.So
WP_Query
is not doing any useless work, as I thought ^^Hope this helps others!
-
私の答えを見てください.私はあなたが何を意味するのか理解していると思います:-)See my answer. I think I understand what you mean :-)
- 0
- 2015-03-18
- Pieter Goosen
-
はい!あなたはそれを非常にうまくやった:Dついに私はそれをする方法を手に入れた、そして私はすべてを理解する=Dありがとう@PieterGoosen!Yes! You did it very well :D Finally I got the way to do it, and I understand all =D Thanks @PieterGoosen!
- 0
- 2015-03-19
- EliasNS
-
完了!それは私自身の答えを拡張しました^^ @ PieterGoosenDone! It extended my own answer ^^ @PieterGoosen
- 0
- 2015-03-19
- EliasNS
-
- 2015-03-18
わかりました.「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クエリOk , lets you have post type called 'blog_posts' , and you want to fetch 5 posts of that post type . Here is what you need to do
$args = array( 'post_type' => 'blog_posts', 'posts_per_page' => '5', ); $query = new WP_Query($args);
The above query will return 5 posts of type 'blog_posts' , if it is not a custom post type , then just replace like this
'post_type' => 'posts',
if you want to fetch all posts then replace like this'posts_per_page' => '-1',
, for more details WP Query-
質問のコメントをご覧ください.See the comments on the question, please.
- 0
- 2015-03-18
- EliasNS
-
- 2015-03-18
@ 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
I know that @user1750063 has mentioned the code but try this
$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`は無効なパラメータです`id` is invalid as an `orderby` value and `pagination` is an invalid parameter
- 0
- 2015-03-18
- Pieter Goosen
-
`pagination`は有効なパラメータではありません.`'nopaging'=>true`を意味しますか?はいの場合、すべての投稿を取得します.それは私が望むものではありません.@PieterGoosen彼は `ID`を意味すると思います.`pagination`is not a valid parameter. You mean `'nopaging' => true`? If yes, then I'll get ALL posts. That's not what I want. @PieterGoosen I think he means `ID`.
- 0
- 2015-03-18
- EliasNS
-
orderbyは注文を表示するためのものですよね?nopagingの値/パラメータに害はありません. @PieterGoosenなぜIDとorderbyが無効なのですか?ポイントを明確にできますか?orderby is for displaying the order, right? It does not harm the nopaging value/ parameter. @PieterGoosen why is ID & orderby is invalid? Can you clarify the point?
- 0
- 2015-03-18
- Shreyo Gi
-
`id`ではなく` ID`である必要がありますIt should be `ID`, not `id`
- 0
- 2015-03-18
- Pieter Goosen
-
- 2020-06-18
カスタムフィールドで制限します.以下のクエリサンプルを確認してください:
$wp_query = new WP_Query("orderby=DESC&post_type=portfolio&meta_key=FeaturedProject&meta_value=1&posts_per_page=6");
6つの注目プロジェクトが返されます.
I would limit it with custom fields, check this query sample below:
$wp_query = new WP_Query("orderby=DESC&post_type=portfolio&meta_key=FeaturedProject&meta_value=1&posts_per_page=6");
It will return 6 Featured projects.
私はGoogleとWPSEについて調査してきましたが、繰り返し目にするのは
showposts
を使用することだけです.これは非推奨です.私は
WP_Query
に精通しており、posts_per_page
を制限(つまり5)に設定し、nopaging
をに設定すると、true
の場合、「わかりました.投稿は5つだけにします」のようになります.しかし、これは機能しません.どうすればこれを行うことができますか?