Make WordPress Core

Changeset 57623


Ignore:
Timestamp:
02/13/2024 01:46:45 PM (3 years ago)
Author:
spacedmonkey
Message:

REST API: Set maximum 'per_page' for embedded REST API requests.

This enhancement refines the REST API server to automatically establish the maximum 'per_page' value for embedded objects, adhering to the endpoint's schema when not explicitly defined in the request. This adjustment elevates the limit from the default of 10 items to 100 items, significantly improving the likelihood of receiving the complete dataset of embedded objects.

Props manyourisms, lpawlik, spacedmonkey, kadamwhite, TimothyBlynJacobs.
Fixes #43439.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/class-wp-rest-server.php

    r57312 r57623  
    744744                                        }
    745745
     746                                        if ( empty( $request['per_page'] ) ) {
     747                                                $matched = $this->match_request_to_handler( $request );
     748                                                if ( ! is_wp_error( $matched ) && isset( $matched[1]['args']['per_page']['maximum'] ) ) {
     749                                                        $request['per_page'] = (int) $matched[1]['args']['per_page']['maximum'];
     750                                                }
     751                                        }
     752
    746753                                        // Embedded resources get passed context=embed.
    747754                                        if ( empty( $request['context'] ) ) {
  • trunk/tests/phpunit/tests/rest-api/rest-posts-controller.php

    r57108 r57623  
    1919        protected static $supported_formats;
    2020        protected static $post_ids    = array();
     21        protected static $terms       = array();
    2122        protected static $total_posts = 30;
    2223        protected static $per_page    = 50;
     
    2930        public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
    3031                self::$post_id = $factory->post->create();
     32                self::$terms   = $factory->term->create_many( 15, array( 'taxonomy' => 'category' ) );
     33                wp_set_object_terms( self::$post_id, self::$terms, 'category' );
    3134
    3235                self::$superadmin_id  = $factory->user->create(
     
    222225                sort( $keys );
    223226                $this->assertSame( array( 'context', 'id', 'password' ), $keys );
     227        }
     228
     229        public function test_registered_get_items_embed() {
     230                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     231                $request->set_param( 'include', array( self::$post_id ) );
     232                $response = rest_get_server()->dispatch( $request );
     233                $response = rest_get_server()->response_to_data( $response, true );
     234                $this->assertArrayHasKey( '_embedded', $response[0], 'The _embedded key must exist' );
     235                $this->assertArrayHasKey( 'wp:term', $response[0]['_embedded'], 'The wp:term key must exist' );
     236                $this->assertCount( 15, $response[0]['_embedded']['wp:term'][0], 'Should should be 15 terms and not the default 10' );
     237                $i = 0;
     238                foreach ( $response[0]['_embedded']['wp:term'][0] as $term ) {
     239                        $this->assertSame( self::$terms[ $i ], $term['id'], 'Check term id existing in response' );
     240                        ++$i;
     241                }
    224242        }
    225243
  • trunk/tests/phpunit/tests/rest-api/rest-server.php

    r57147 r57623  
    930930                $this->assertArrayNotHasKey( '_embedded', $result );
    931931                $this->assertSame( 'data', $result['untouched'] );
     932        }
     933
     934        /**
     935         * Ensure embedding is with links in the data.
     936         *
     937         * @ticket 43439
     938         */
     939        public function test_link_embedding_with_links() {
     940                $data = array(
     941                        '_links' => array(
     942                                'wp:term' => array(
     943                                        array(
     944                                                'taxonomy'   => 'category',
     945                                                'embeddable' => true,
     946                                                'href'       => get_rest_url( 0, '/wp/v2/categories' ),
     947                                        ),
     948                                        array(
     949                                                'taxonomy'   => 'post_tag',
     950                                                'embeddable' => true,
     951                                                'href'       => get_rest_url( 0, '/wp/v2/tags' ),
     952                                        ),
     953                                ),
     954                        ),
     955                );
     956
     957                $mock = new MockAction();
     958                add_filter( 'rest_post_dispatch', array( $mock, 'filter' ), 10, 3 );
     959
     960                rest_get_server()->embed_links( $data, true );
     961                $args = $mock->get_args();
     962                foreach ( $args as $arg ) {
     963                        $this->assertSame( 100, $arg[2]['per_page'], 'Posts per page should be 100' );
     964                }
    932965        }
    933966
Note: See TracChangeset for help on using the changeset viewer.