WordPress API JSON return limit

This is a simple question regarding WordPress API /wp-json. I am querying some data filtered with certain category in WordPress. My questions is how can I control amount of result that gets returned from my Get request… The default returns seems to return around 11 most recent results. Is there any way I can make it return only 1 (most recent), or like 100 posts. What is the minimum and maximum amount I can return. And what is the syntax for it. This is the default request I have:

http://thisismywebsitewherewordpresslives.com/wp-json/posts?fiter[category_name]=Some Category Name I want to query&filter[order]=ASC

Related posts

Leave a Reply

9 comments

  1. If you’re using v2 of the WordPress REST API, it looks like the current method of controlling the number of results returned is:

    website.com/wp-json/wp/v2/posts/?per_page=100
    

    Replace 100 with the desired count.

    If you’re using a custom post type, replace posts with the custom post type. Also make sure to set 'show_in_rest' => true when configuring the custom post type.

  2. My recommendation above is no longer correct. Now you’ll want to use:

    website.com/wp-json/wp/v2/posts/?filter[posts_per_page]=100
    

    Change the number to retrieve more or fewer posts. Change “posts” to your custom post type if necessary and make sure to set 'show_in_rest' => true when registering the custom post type.

    Note: The accepted solution is the way to go. This followup happened when these endpoints were evolving the accepted solution was broken temporarily.

  3. You might change:

    add_action( 'rest_YOUR_CPT_params', function($params){
        if ( isset( $params ) AND isset( $params[ 'per_page' ] ) ) {
            $params[ 'per_page' ][ 'maximum' ] = 500;
        }
        return $params;
    });
    
    

    And in fetch url add ?per_page=500

    Example: https://domain.pl/wp-json/wp/v2/books?per_page=500

  4. I’m surprised no one mentioned using the native filters WordPress has created for situations exactly like this.

    I was able to achieve returning a desired amount of posts by default, while still allowing the $_GET['per_page'] param to work like so:

    /**
     * Default to all posts being returned rather than the default 10 posts per
     * page. Also, do not get in the way of the native $_GET['per_page'] setting.
     * @param {int} $newDefault  The new default amount of posts to return per paginated page
     * @var {void}
     */
    function setRestApiPostsPerPage($newDefault) {
        foreach (get_post_types() as $i => $postType) {
            add_filter( "rest_{$postType}_query", function ($args, $request) {
                if (! isset($_GET['per_page'])) {
                    // new default to overwrite the default 10
                    $args['posts_per_page'] = $newDefault; 
                }
    
                return $args;
            }, 15, 2);
        }
    }
    

    I did find out you can’t set $args['posts_per_page'] = -1; That results in an error being thrown which you can see here.

    You can throw any logic within the closure/callback/filter to set the $args['posts_per_page'] however you’d like to.

  5. In reference to Aaron Nusselbaum answer but corrected a few things:

    • add_filter instead of add_action
    • filter name must contain additional ‘_collection’, so ‘rest_YOUR_CPT_collection_params’

    For example:

    add_filter( 'rest_comment_collection_params', function($params){
        if ( isset( $params ) AND isset( $params[ 'per_page' ] ) ) {
            $params[ 'per_page' ][ 'maximum' ] = 500;
        }
        return $params;
    });