Make WordPress Core

Changeset 59630


Ignore:
Timestamp:
01/15/2025 06:34:35 PM (4 weeks ago)
Author:
flixos90
Message:

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.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php

    r58262 r59630  
    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
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    r59544 r59630  
    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
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php

    r57648 r59630  
    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
  • trunk/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php

    r58673 r59630  
    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
  • trunk/tests/phpunit/tests/rest-api/rest-posts-controller.php

    r59544 r59630  
    56785678
    56795679    /**
     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
     5718    /**
    56805719     * Internal function used to disable an insert query which
    56815720     * will trigger a wpdb error for testing purposes.
  • trunk/tests/phpunit/tests/rest-api/rest-revisions-controller.php

    r57987 r59630  
    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}
  • trunk/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php

    r59605 r59630  
    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}
Note: See TracChangeset for help on using the changeset viewer.