In this example i will show you how to create custom route for posts queried by tag and use pagination for end result. For paginating query result it is not recommended to use get_posts() method but WP_Query class.
so let's create custom route:
so let's create custom route:
add_action( 'rest_api_init', function () { register_rest_route( 'myspace/v1/', 'get-by-tag/(?P<slug>[a-z0-9]+(?:-[a-z0-9]+)*)/(?P<page>[1-9]{1,2})', array( 'methods' => WP_REST_Server::READABLE, 'callback' => 'myspace_get_posts_by_tag', 'args' => array( 'slug' => array ( 'required' => true ), 'page' => array ( 'required' => true ), ) ) ); } );
In our example we can call this url with pagination number at the end: myspace/v1/get-by-tag/tag-name/2
Next, let's create callback method:
Next, let's create callback method:
function myspace_get_posts_by_tag(WP_REST_Request $request){ // get slug and page number $slug = $request['slug']; $page = $request['page']; // get tag -> more info here: https://www.coditty.com/code/wordpress-rest-api-get-posts-by-tag $term = get_term_by('slug', $slug, 'post_tag'); $args = array( 'tag__in' => $term->term_id, 'posts_per_page' => $posts_per_page, 'paged' => $page, 'orderby' => 'date', 'order' => 'desc', ); // use WP_Query to get the results with pagination $query = new WP_Query( $args ); // if no posts found return if( empty($query->posts) ){ return new WP_Error( 'no_posts', __('No post found'), array( 'status' => 404 ) ); } // set max number of pages and total num of posts $max_pages = $query->max_num_pages; $total = $query->found_posts; $posts = $query->posts; // prepare data for output $controller = new WP_REST_Posts_Controller('post'); foreach ( $posts as $post ) { $response = $controller->prepare_item_for_response( $post, $request ); $data[] = $controller->prepare_response_for_collection( $response ); } // set headers and return response $response = new WP_REST_Response($data, 200); $response->header( 'X-WP-Total', $total ); $response->header( 'X-WP-TotalPages', $max_pages ); return $response; }
In our example we are returning in header total number of pages and total number of posts