Make WordPress Core

Ticket #45099: 45099.diff

File 45099.diff, 3.6 KB (added by dlh, 6 years ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php

    diff --git src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php
    index 3bc6b59091..04bd1580f7 100644
    abstract class WP_REST_Controller { 
    385385
    386386                $additional_fields = $this->get_additional_fields();
    387387
     388                $requested_fields = $this->get_fields_for_response( $request );
     389
    388390                foreach ( $additional_fields as $field_name => $field_options ) {
    389391
    390392                        if ( ! $field_options['get_callback'] ) {
    391393                                continue;
    392394                        }
    393395
     396                        if ( ! in_array( $field_name, $requested_fields, true ) ) {
     397                                continue;
     398                        }
     399
    394400                        $object[ $field_name ] = call_user_func( $field_options['get_callback'], $object, $field_name, $request, $this->get_object_type() );
    395401                }
    396402
  • tests/phpunit/tests/rest-api/rest-controller.php

    diff --git tests/phpunit/tests/rest-api/rest-controller.php tests/phpunit/tests/rest-api/rest-controller.php
    index 88941ec1ee..b325fb19e2 100644
    class WP_Test_REST_Controller extends WP_Test_REST_TestCase { 
    213213                        'someinteger',
    214214                ), $fields );
    215215        }
     216
     217        public function test_add_additional_fields_to_object_respects_fields_param() {
     218                $controller = new WP_REST_Test_Controller();
     219                $request    = new WP_REST_Request( 'GET', '/wp/v2/testroute' );
     220                $schema     = $controller->get_item_schema();
     221                $field      = 'somefield';
     222
     223                $listener = new MockAction();
     224                $method = 'action';
     225
     226                register_rest_field(
     227                        $schema['title'],
     228                        $field,
     229                        array(
     230                                'get_callback' => array( $listener, $method ),
     231                                'schema'       => array(
     232                                        'type' => 'string',
     233                                ),
     234                        )
     235                );
     236
     237                $item = [];
     238
     239                $controller->prepare_item_for_response( $item, $request );
     240
     241                $first_call_count = $listener->get_call_count( $method );
     242
     243                $this->assertTrue( $first_call_count > 0 );
     244
     245                $request->set_param( '_fields', 'somestring' );
     246
     247                $controller->prepare_item_for_response( $item, $request );
     248
     249                $this->assertSame( $first_call_count, $listener->get_call_count( $method ) );
     250
     251                $request->set_param( '_fields', $field );
     252
     253                $controller->prepare_item_for_response( $item, $request );
     254
     255                $this->assertTrue( $listener->get_call_count( $method ) > $first_call_count );
     256        }
    216257}
  • tests/phpunit/tests/rest-api/rest-test-controller.php

    diff --git tests/phpunit/tests/rest-api/rest-test-controller.php tests/phpunit/tests/rest-api/rest-test-controller.php
    index 5b90f76e44..a8c3fefe0a 100644
     
    1010 * @group restapi
    1111 */
    1212class WP_REST_Test_Controller extends WP_REST_Controller {
     13        /**
     14         * Prepares the item for the REST response.
     15         *
     16         * @param mixed           $item    WordPress representation of the item.
     17         * @param WP_REST_Request $request Request object.
     18         * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
     19         */
     20        public function prepare_item_for_response( $item, $request ) {
     21                $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
     22                $item = $this->add_additional_fields_to_object( $item, $request );
     23                $item = $this->filter_response_by_context( $item, $context );
     24                $response = rest_ensure_response( $item );
     25                return $response;
     26        }
    1327
    1428        /**
    15          * Get the Post type's schema, conforming to JSON Schema
     29         * Get the item's schema, conforming to JSON Schema.
    1630         *
    1731         * @return array
    1832         */
    class WP_REST_Test_Controller extends WP_REST_Controller { 
    7286                        ),
    7387                );
    7488
    75                 return $schema;
     89                return $this->add_additional_fields_schema( $schema );
    7690        }
    7791
    7892}