WP_REST_Revisions_Controller
Core class used to access revisions via the REST API. Provides read-only access to post revisions plus deletion capability.
Class Synopsis
class WP_REST_Revisions_Controller extends WP_REST_Controller {
private $parent_post_type;
private $parent_controller;
private $parent_base;
protected $meta;
public function __construct( string $parent_post_type );
public function register_routes();
// Permission Checks
public function get_items_permissions_check( $request );
public function get_item_permissions_check( $request );
public function delete_item_permissions_check( $request );
// Operations
public function get_items( $request );
public function get_item( $request );
public function delete_item( $request );
// Data Preparation
protected function prepare_items_query( $prepared_args, $request );
public function prepare_item_for_response( $item, $request );
protected function prepare_links( $revision );
// Schema & Parameters
public function get_item_schema();
public function get_collection_params();
// Utilities
protected function get_parent( $parent_post_id );
protected function get_revision( $id );
protected function check_read_permission( $post );
}
Endpoints
Revisions are nested under their parent post type:
| Method | Endpoint | Description |
|---|---|---|
| GET | /wp/v2/posts/{parent}/revisions |
List revisions for a post |
| GET | /wp/v2/posts/{parent}/revisions/{id} |
Get a single revision |
| DELETE | /wp/v2/posts/{parent}/revisions/{id} |
Delete a revision |
| GET | /wp/v2/pages/{parent}/revisions |
List revisions for a page |
Constructor
public function __construct( string $parent_post_type )
Parameters:
$parent_post_type– Post type of the parent (e.g.,'post','page')
Behavior:
- Gets or creates the parent post type’s controller
- Sets
rest_baseto'revisions' - Sets
parent_basefrom parent post type’srest_base - Creates
WP_REST_Post_Meta_Fieldsinstance for the parent post type
Collection Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
context |
string | ‘view’ | Scope under which request is made |
page |
integer | 1 | Current page |
per_page |
integer | 10 | Items per page (max 100, or -1 for all) |
search |
string | – | Search string |
exclude |
array | [] | Exclude specific IDs |
include |
array | [] | Include specific IDs |
offset |
integer | – | Offset for pagination |
order |
string | ‘desc’ | Sort order (asc/desc) |
orderby |
string | ‘date’ | Sort field |
Orderby Options
date– Revision date (includes ID for stable sorting)id– Revision IDinclude– Order by include parameterrelevance– Search relevance (requires search)slug– Revision slug
Schema Properties
| Property | Type | Context | Description |
|---|---|---|---|
author |
integer | view, edit, embed | Revision author ID |
date |
string | view, edit, embed | Revision date (site timezone) |
date_gmt |
string | view, edit | Revision date (GMT) |
guid |
object | view, edit | Global unique identifier |
id |
integer | view, edit, embed | Revision ID (readonly) |
modified |
string | view, edit | Modified date (site timezone) |
modified_gmt |
string | view, edit | Modified date (GMT) |
parent |
integer | view, edit, embed | Parent post ID |
slug |
string | view, edit, embed | Revision slug |
title |
object | view, edit, embed | Title (raw/rendered) |
content |
object | view, edit | Content (raw/rendered) |
excerpt |
object | view, edit, embed | Excerpt (raw/rendered) |
meta |
object | view, edit | Revision meta (since 6.4.0) |
Permission Checks
get_items_permissions_check()
- Validates parent post exists and matches post type
- Requires
edit_postcapability for parent post
get_item_permissions_check()
- Validates parent post and revision exist
- Revision must belong to parent post
- Requires
edit_postcapability for parent post
delete_item_permissions_check()
- Validates parent post and revision exist
- Requires
delete_postcapability for parent post
Key Methods
get_parent()
protected function get_parent( int $parent_post_id ): WP_Post|WP_Error
Gets the parent post if:
- ID is valid (> 0)
- Post exists
- Post matches controller’s parent post type
get_revision()
protected function get_revision( int $id ): WP_Post|WP_Error
Gets the revision if:
- ID is valid (> 0)
- Post exists
- Post type is
'revision'
check_read_permission()
protected function check_read_permission( WP_Post $post ): bool
Checks read permission using parent controller’s method.
Response Links
| Relation | Description |
|---|---|
self |
Link to this revision |
parent |
Link to parent post |
Deletion Behavior
DELETE /wp/v2/posts/{parent}/revisions/{id}
Required Parameter:
force– Must betrue(revisions don’t support trashing)
Response:
{
"deleted": true,
"previous": {
"id": 789,
"author": 1,
"date": "2024-01-15T10:30:00",
"title": { "rendered": "Post Title" },
...
}
}
Revisions Disabled
When revisions are disabled for a post type, the collection returns empty with proper headers:
X-WP-Total: 0X-WP-TotalPages: 0
Check if revisions are enabled:
wp_revisions_enabled( $post );
Usage Example
// Get revisions for a post
$request = new WP_REST_Request( 'GET', '/wp/v2/posts/123/revisions' );
$request->set_param( 'per_page', 10 );
$controller = new WP_REST_Revisions_Controller( 'post' );
$response = $controller->get_items( $request );
// Get all revisions (no pagination)
$request = new WP_REST_Request( 'GET', '/wp/v2/posts/123/revisions' );
$request->set_param( 'per_page', -1 );
$response = $controller->get_items( $request );
// Get a specific revision
$request = new WP_REST_Request( 'GET', '/wp/v2/posts/123/revisions/789' );
$request->set_param( 'context', 'edit' );
$response = $controller->get_item( $request );
// Delete a revision
$request = new WP_REST_Request( 'DELETE', '/wp/v2/posts/123/revisions/789' );
$request->set_param( 'force', true );
$response = $controller->delete_item( $request );
Related Controllers
WP_REST_Autosaves_Controller
Extends this class to handle autosaves specifically:
- Endpoint:
/wp/v2/posts/{parent}/autosaves - Can create autosaves (POST)
- Filters to only autosave revisions
WP_REST_Template_Revisions_Controller
Handles revisions for block templates:
- Endpoint:
/wp/v2/templates/{parent}/revisions
WP_REST_Global_Styles_Revisions_Controller
Handles revisions for global styles:
- Endpoint:
/wp/v2/global-styles/{parent}/revisions
Pagination Differences
Unlike other controllers, revisions support per_page=-1 to fetch all revisions at once. This is the default behavior for backward compatibility.
When paginating:
- Invalid
offsetreturns error if >= total revisions - Invalid
pagereturns error if > max pages
Source
wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php
Since
WordPress 4.7.0
Changelog
| Version | Description |
|---|---|
| 4.7.0 | Introduced |
| 6.4.0 | Added meta field support |