Collection Pagination
WordPress sites can have a lot of content—far more than you’d want to pull down in a single request. The API endpoints default to providing a limited number of items per request, the same way that a WordPress site will default to 10 posts per page in archive views. The number of objects you can get back can be adjusted by calling the perPage
method, but perPage
is capped at 100 items per request for performance reasons. To work around these restrictions, the API provides headers so the API will frequently have to return your posts be unable to fit all of your posts in a single query.
Using Pagination Headers
Paginated collection responses are augmented with a _paging
property derived from the collection’s pagination headers. That _paging
property on the response object contains some useful metadata:
.total
: The total number of records matching the provided query.totalPages
: The number of pages available (total
/perPage
).next
: A WPRequest object pre-bound to the next page of results.prev
: A WPRequest object pre-bound to the previous page of results.links
: an object containing the parsedlink
HTTP header data (when present)
The existence of the _paging.links.prev
and _paging.links.next
properties can be used as flags to conditionally show or hide your paging UI, if necessary, as they will only be present when an adjacent page of results is available.
You can use the next
and prev
properties to traverse an entire collection, should you so choose. For example, this snippet will recursively request the next page of posts and concatenate it with existing results, in order to build up an array of every post on your site:
var _ = require( 'lodash' );
getAll( request ) {
return request.then(function( response ) {
if ( ! response._paging || ! response._paging.next ) {
return response;
}
// Request the next page and return both responses as one collection
return Promise.all([
response,
getAll( response._paging.next )
]).then(function( responses ) {
return _.flatten( responses );
});
});
}
// Kick off the request
getAll( wp.posts() ).then(function( allPosts ) { /* ... */ });
Be aware that this sort of unbounded recursion can take a very long time: if you use this technique in your application, we strongly recommend caching the response objects in a local database rather than re-requesting from the WP remote every time you need them.
Depending on the amount of content in your site loading all posts into memory may also exceed Node’s available memory, causing an exception. If this occurs, try to work with smaller subsets of your data at a time.
Requesting a Specific Page
You can also use a .page(pagenumber)
method on calls that support pagination to directly get that page. For example, to set the API to return 5 posts on every page of results, and to get the third page of results (posts 11 through 15), you would write
wp.posts().perPage( 5 ).page( 3 ).then(/* ... */);
Using offset
If you prefer to think about your collections in terms of offset, or how many items “into” the collection you want to query, you can use the offset
parameter (and parameter convenience method) instead of page
. These are equivalent:
// With .page()
wp.posts().perPage( 5 ).page( 3 )...
// With .offset()
wp.posts().perPage( 5 ).offset( 10 )...