How to limit the number of posts that WP_Query gets?
I have been researching on Google and WPSE and the only thing I see repeatedly is to use
showposts, that is deprecated.
I am familiar with
WP_Query, and I thought that if I set
posts_per_pageto my limit (ie. 5), and
true, it would become to something like "Ok, I'll give you only 5 posts". But this doesn't work.
How can I do this?
I 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
You should not set the `nopaging` parameter, setting that to true means to get **all** posts
@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.
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
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.
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
I think that now I understand what you are trying to do. When you run a custom query with
WP_Queryand 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_Querystill 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
$max_num_pagesproperties 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 expected
echo $q->found_postswill give you
echo $q->max_num_pageswill give you
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_rowswhich uses boolean values which you can use to make your query bail after it found the 5 posts you need. This will force
WP_Querynot to look for any more posts mathing the criteria after it has retrieved the amount of posts queried. This parameter is already build into
get_posts, that is why
get_postsis a bit faster than
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.