Skip to content

Commit d2630e0

Browse files
committed
REST API: Fix PHP warning about undefined paged argument in various REST API endpoints.
This bug could occur in `WP_REST_Posts_Controller`, `WP_REST_Global_Styles_Revisions_Controller`, `WP_REST_Revisions_Controller`, and any of their child classes. This changeset fixes it throughout. Props apermo, pbearne, hemant-ahir, flixos90. Fixes #62292. git-svn-id: https://develop.svn.wordpress.org/trunk@59630 602fd350-edb4-49c9-b593-d223f7449a82
1 parent aaf760c commit d2630e0

7 files changed

+163
-3
lines changed

src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public function get_items( $request ) {
189189
$revisions_query = new WP_Query();
190190
$revisions = $revisions_query->query( $query_args );
191191
$offset = isset( $query_args['offset'] ) ? (int) $query_args['offset'] : 0;
192-
$page = (int) $query_args['paged'];
192+
$page = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0;
193193
$total_revisions = $revisions_query->found_posts;
194194

195195
if ( $total_revisions < 1 ) {

src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ static function ( $format ) {
457457
remove_filter( 'post_password_required', array( $this, 'check_password_required' ) );
458458
}
459459

460-
$page = (int) $query_args['paged'];
460+
$page = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0;
461461
$total_posts = $posts_query->found_posts;
462462

463463
if ( $total_posts < 1 && $page > 1 ) {

src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ public function get_items( $request ) {
294294
$revisions_query = new WP_Query();
295295
$revisions = $revisions_query->query( $query_args );
296296
$offset = isset( $query_args['offset'] ) ? (int) $query_args['offset'] : 0;
297-
$page = (int) $query_args['paged'];
297+
$page = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0;
298298
$total_revisions = $revisions_query->found_posts;
299299

300300
if ( $total_revisions < 1 ) {

tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php

+41
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,47 @@ public function test_get_items_out_of_bounds_page_should_not_error_if_offset() {
826826
$this->assertCount( $expected_count, $response->get_data() );
827827
}
828828

829+
830+
/**
831+
* Tests for the pagination.
832+
*
833+
* @ticket 62292
834+
*
835+
* @covers WP_REST_Global_Styles_Controller::get_items
836+
*/
837+
public function test_get_global_styles_revisions_pagination() {
838+
wp_set_current_user( self::$admin_id );
839+
840+
// Test offset
841+
$request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions' );
842+
$request->set_param( 'offset', 1 );
843+
$request->set_param( 'per_page', 1 );
844+
$response = rest_get_server()->dispatch( $request );
845+
$this->assertEquals( 200, $response->get_status() );
846+
$data = $response->get_data();
847+
$this->assertCount( 1, $data );
848+
$this->assertEquals( 3, $response->get_headers()['X-WP-Total'] );
849+
$this->assertEquals( 3, $response->get_headers()['X-WP-TotalPages'] );
850+
851+
// Test paged
852+
$request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions' );
853+
$request->set_param( 'page', 2 );
854+
$request->set_param( 'per_page', 2 );
855+
$response = rest_get_server()->dispatch( $request );
856+
$this->assertEquals( 200, $response->get_status() );
857+
$data = $response->get_data();
858+
$this->assertCount( 1, $data );
859+
$this->assertEquals( 3, $response->get_headers()['X-WP-Total'] );
860+
$this->assertEquals( 2, $response->get_headers()['X-WP-TotalPages'] );
861+
862+
// Test out of bounds
863+
$request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions' );
864+
$request->set_param( 'page', 4 );
865+
$request->set_param( 'per_page', 6 );
866+
$response = rest_get_server()->dispatch( $request );
867+
$this->assertErrorResponse( 'rest_revision_invalid_page_number', $response, 400 );
868+
}
869+
829870
/**
830871
* @doesNotPerformAssertions
831872
*/

tests/phpunit/tests/rest-api/rest-posts-controller.php

+39
Original file line numberDiff line numberDiff line change
@@ -5676,6 +5676,45 @@ public function test_multiple_post_format_support() {
56765676
$this->assertCount( 2, $response->get_data(), 'Two posts are expected to be returned' );
56775677
}
56785678

5679+
/**
5680+
* Tests for the pagination.
5681+
*
5682+
* @ticket 62292
5683+
*
5684+
* @covers WP_REST_Posts_Controller::get_items
5685+
*/
5686+
public function test_get_posts_with_pagination() {
5687+
5688+
// Test offset
5689+
$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
5690+
$request->set_param( 'offset', 1 );
5691+
$request->set_param( 'per_page', 1 );
5692+
$response = rest_get_server()->dispatch( $request );
5693+
$this->assertEquals( 200, $response->get_status() );
5694+
$data = $response->get_data();
5695+
$this->assertCount( 1, $data );
5696+
$this->assertEquals( 30, $response->get_headers()['X-WP-Total'] );
5697+
$this->assertEquals( 30, $response->get_headers()['X-WP-TotalPages'] );
5698+
5699+
// Test paged
5700+
$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
5701+
$request->set_param( 'page', 2 );
5702+
$request->set_param( 'per_page', 2 );
5703+
$response = rest_get_server()->dispatch( $request );
5704+
$this->assertEquals( 200, $response->get_status() );
5705+
$data = $response->get_data();
5706+
$this->assertCount( 2, $data );
5707+
$this->assertEquals( 30, $response->get_headers()['X-WP-Total'] );
5708+
$this->assertEquals( 15, $response->get_headers()['X-WP-TotalPages'] );
5709+
5710+
// Test out of bounds
5711+
$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
5712+
$request->set_param( 'page', 4 );
5713+
$request->set_param( 'per_page', 10 );
5714+
$response = rest_get_server()->dispatch( $request );
5715+
$this->assertErrorResponse( 'rest_post_invalid_page_number', $response, 400 );
5716+
}
5717+
56795718
/**
56805719
* Internal function used to disable an insert query which
56815720
* will trigger a wpdb error for testing purposes.

tests/phpunit/tests/rest-api/rest-revisions-controller.php

+40
Original file line numberDiff line numberDiff line change
@@ -864,4 +864,44 @@ public function test_get_items_out_of_bounds_page_should_not_error_if_offset() {
864864
$response = rest_get_server()->dispatch( $request );
865865
$this->assertCount( $expected_count, $response->get_data() );
866866
}
867+
868+
/**
869+
* Tests for the pagination.
870+
*
871+
* @ticket 62292
872+
*
873+
* @covers WP_REST_Revisions_Controller::get_items
874+
*/
875+
public function test_get_template_revisions_pagination() {
876+
wp_set_current_user( self::$editor_id );
877+
878+
// Test offset
879+
$request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions' );
880+
$request->set_param( 'offset', 1 );
881+
$request->set_param( 'per_page', 1 );
882+
$response = rest_get_server()->dispatch( $request );
883+
$this->assertEquals( 200, $response->get_status() );
884+
$data = $response->get_data();
885+
$this->assertCount( 1, $data );
886+
$this->assertEquals( $this->total_revisions, $response->get_headers()['X-WP-Total'] );
887+
$this->assertEquals( $this->total_revisions, $response->get_headers()['X-WP-TotalPages'] );
888+
889+
// Test paged
890+
$request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions' );
891+
$request->set_param( 'page', 2 );
892+
$request->set_param( 'per_page', 2 );
893+
$response = rest_get_server()->dispatch( $request );
894+
$this->assertEquals( 200, $response->get_status() );
895+
$data = $response->get_data();
896+
$this->assertCount( 1, $data );
897+
$this->assertEquals( $this->total_revisions, $response->get_headers()['X-WP-Total'] );
898+
$this->assertEquals( (int) ceil( $this->total_revisions / 2 ), $response->get_headers()['X-WP-TotalPages'] );
899+
900+
// Test out of bounds
901+
$request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions' );
902+
$request->set_param( 'page', $this->total_revisions + 1 );
903+
$request->set_param( 'per_page', 1 );
904+
$response = rest_get_server()->dispatch( $request );
905+
$this->assertErrorResponse( 'rest_revision_invalid_page_number', $response, 400 );
906+
}
867907
}

tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php

+40
Original file line numberDiff line numberDiff line change
@@ -1065,4 +1065,44 @@ public function data_delete_item_not_found() {
10651065
),
10661066
);
10671067
}
1068+
1069+
/**
1070+
* Tests for the pagination.
1071+
*
1072+
* @ticket 62292
1073+
*
1074+
* @covers WP_REST_Template_Revisions_Controller::get_items
1075+
*/
1076+
public function test_get_template_revisions_pagination() {
1077+
wp_set_current_user( self::$admin_id );
1078+
1079+
// Test offset
1080+
$request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' );
1081+
$request->set_param( 'offset', 1 );
1082+
$request->set_param( 'per_page', 1 );
1083+
$response = rest_get_server()->dispatch( $request );
1084+
$this->assertEquals( 200, $response->get_status() );
1085+
$data = $response->get_data();
1086+
$this->assertCount( 1, $data );
1087+
$this->assertEquals( 4, $response->get_headers()['X-WP-Total'] );
1088+
$this->assertEquals( 4, $response->get_headers()['X-WP-TotalPages'] );
1089+
1090+
// Test paged
1091+
$request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' );
1092+
$request->set_param( 'page', 2 );
1093+
$request->set_param( 'per_page', 2 );
1094+
$response = rest_get_server()->dispatch( $request );
1095+
$this->assertEquals( 200, $response->get_status() );
1096+
$data = $response->get_data();
1097+
$this->assertCount( 2, $data );
1098+
$this->assertEquals( 4, $response->get_headers()['X-WP-Total'] );
1099+
$this->assertEquals( 2, $response->get_headers()['X-WP-TotalPages'] );
1100+
1101+
// Test out of bounds
1102+
$request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' );
1103+
$request->set_param( 'page', 4 );
1104+
$request->set_param( 'per_page', 6 );
1105+
$response = rest_get_server()->dispatch( $request );
1106+
$this->assertErrorResponse( 'rest_revision_invalid_page_number', $response, 400 );
1107+
}
10681108
}

0 commit comments

Comments
 (0)