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_page to my limit (ie. 5), and nopaging to true, it would become to something like "Ok, I'll give you only 5 posts". But this doesn't work.

    enter image description here

    How can I do this?

    Just `'posts_per_page=5'`

    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_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 expected
    • echo $q->found_posts will give you 20
    • echo $q->max_num_pages will give you 4

    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 force WP_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 into get_posts, that is why get_posts is a bit faster than WP_Query although get_posts uses WP_Query


    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.

License under CC-BY-SA with attribution

Content dated before 6/26/2020 9:53 AM