WordPress.org

Make WordPress Core

Ticket #43874: 43874.1.diff

File 43874.1.diff, 46.1 KB (added by danielbachhuber, 3 years ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php
    index 30ddafc982..26f462e4f3 100644
    a b class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    284284         */
    285285        public function prepare_item_for_response( $post, $request ) {
    286286                $response = parent::prepare_item_for_response( $post, $request );
     287                $fields   = $this->get_fields_for_response( $request );
    287288                $data     = $response->get_data();
    288289
    289                 $data['description'] = array(
    290                         'raw'      => $post->post_content,
     290                if ( in_array( 'description', $fields, true ) ) {
     291                        $data['description'] = array(
     292                                'raw'      => $post->post_content,
     293                                /** This filter is documented in wp-includes/post-template.php */
     294                                'rendered' => apply_filters( 'the_content', $post->post_content ),
     295                        );
     296                }
     297
     298                if ( in_array( 'caption', $fields, true ) ) {
    291299                        /** This filter is documented in wp-includes/post-template.php */
    292                         'rendered' => apply_filters( 'the_content', $post->post_content ),
    293                 );
     300                        $caption         = apply_filters( 'the_excerpt', apply_filters( 'get_the_excerpt', $post->post_excerpt, $post ) );
     301                        $data['caption'] = array(
     302                                'raw'      => $post->post_excerpt,
     303                                'rendered' => $caption,
     304                        );
     305                }
    294306
    295                 /** This filter is documented in wp-includes/post-template.php */
    296                 $caption         = apply_filters( 'the_excerpt', apply_filters( 'get_the_excerpt', $post->post_excerpt, $post ) );
    297                 $data['caption'] = array(
    298                         'raw'      => $post->post_excerpt,
    299                         'rendered' => $caption,
    300                 );
     307                if ( in_array( 'alt_text', $fields, true ) ) {
     308                        $data['alt_text'] = get_post_meta( $post->ID, '_wp_attachment_image_alt', true );
     309                }
    301310
    302                 $data['alt_text']      = get_post_meta( $post->ID, '_wp_attachment_image_alt', true );
    303                 $data['media_type']    = wp_attachment_is_image( $post->ID ) ? 'image' : 'file';
    304                 $data['mime_type']     = $post->post_mime_type;
    305                 $data['media_details'] = wp_get_attachment_metadata( $post->ID );
    306                 $data['post']          = ! empty( $post->post_parent ) ? (int) $post->post_parent : null;
    307                 $data['source_url']    = wp_get_attachment_url( $post->ID );
     311                if ( in_array( 'media_type', $fields, true ) ) {
     312                        $data['media_type'] = wp_attachment_is_image( $post->ID ) ? 'image' : 'file';
     313                }
    308314
    309                 // Ensure empty details is an empty object.
    310                 if ( empty( $data['media_details'] ) ) {
    311                         $data['media_details'] = new stdClass;
    312                 } elseif ( ! empty( $data['media_details']['sizes'] ) ) {
     315                if ( in_array( 'mime_type', $fields, true ) ) {
     316                        $data['mime_type'] = $post->post_mime_type;
     317                }
    313318
    314                         foreach ( $data['media_details']['sizes'] as $size => &$size_data ) {
     319                if ( in_array( 'media_details', $fields, true ) ) {
     320                        $data['media_details'] = wp_get_attachment_metadata( $post->ID );
    315321
    316                                 if ( isset( $size_data['mime-type'] ) ) {
    317                                         $size_data['mime_type'] = $size_data['mime-type'];
    318                                         unset( $size_data['mime-type'] );
    319                                 }
     322                        // Ensure empty details is an empty object.
     323                        if ( empty( $data['media_details'] ) ) {
     324                                $data['media_details'] = new stdClass;
     325                        } elseif ( ! empty( $data['media_details']['sizes'] ) ) {
    320326
    321                                 // Use the same method image_downsize() does.
    322                                 $image_src = wp_get_attachment_image_src( $post->ID, $size );
    323                                 if ( ! $image_src ) {
    324                                         continue;
     327                                foreach ( $data['media_details']['sizes'] as $size => &$size_data ) {
     328
     329                                        if ( isset( $size_data['mime-type'] ) ) {
     330                                                $size_data['mime_type'] = $size_data['mime-type'];
     331                                                unset( $size_data['mime-type'] );
     332                                        }
     333
     334                                        // Use the same method image_downsize() does.
     335                                        $image_src = wp_get_attachment_image_src( $post->ID, $size );
     336                                        if ( ! $image_src ) {
     337                                                continue;
     338                                        }
     339
     340                                        $size_data['source_url'] = $image_src[0];
    325341                                }
    326342
    327                                 $size_data['source_url'] = $image_src[0];
     343                                $full_src = wp_get_attachment_image_src( $post->ID, 'full' );
     344
     345                                if ( ! empty( $full_src ) ) {
     346                                        $data['media_details']['sizes']['full'] = array(
     347                                                'file'       => wp_basename( $full_src[0] ),
     348                                                'width'      => $full_src[1],
     349                                                'height'     => $full_src[2],
     350                                                'mime_type'  => $post->post_mime_type,
     351                                                'source_url' => $full_src[0],
     352                                        );
     353                                }
     354                        } else {
     355                                $data['media_details']['sizes'] = new stdClass;
    328356                        }
     357                }
    329358
    330                         $full_src = wp_get_attachment_image_src( $post->ID, 'full' );
     359                if ( in_array( 'post', $fields, true ) ) {
     360                        $data['post'] = ! empty( $post->post_parent ) ? (int) $post->post_parent : null;
     361                }
    331362
    332                         if ( ! empty( $full_src ) ) {
    333                                 $data['media_details']['sizes']['full'] = array(
    334                                         'file'       => wp_basename( $full_src[0] ),
    335                                         'width'      => $full_src[1],
    336                                         'height'     => $full_src[2],
    337                                         'mime_type'  => $post->post_mime_type,
    338                                         'source_url' => $full_src[0],
    339                                 );
    340                         }
    341                 } else {
    342                         $data['media_details']['sizes'] = new stdClass;
     363                if ( in_array( 'source_url', $fields, true ) ) {
     364                        $data['source_url'] = wp_get_attachment_url( $post->ID );
    343365                }
    344366
    345367                $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
  • src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php
    index e394ccebdf..021c43c84a 100644
    a b class WP_REST_Comments_Controller extends WP_REST_Controller { 
    862862         * @return WP_REST_Response Response object.
    863863         */
    864864        public function prepare_item_for_response( $comment, $request ) {
    865                 $data = array(
    866                         'id'                => (int) $comment->comment_ID,
    867                         'post'              => (int) $comment->comment_post_ID,
    868                         'parent'            => (int) $comment->comment_parent,
    869                         'author'            => (int) $comment->user_id,
    870                         'author_name'       => $comment->comment_author,
    871                         'author_email'      => $comment->comment_author_email,
    872                         'author_url'        => $comment->comment_author_url,
    873                         'author_ip'         => $comment->comment_author_IP,
    874                         'author_user_agent' => $comment->comment_agent,
    875                         'date'              => mysql_to_rfc3339( $comment->comment_date ),
    876                         'date_gmt'          => mysql_to_rfc3339( $comment->comment_date_gmt ),
    877                         'content'           => array(
     865
     866                $fields = $this->get_fields_for_response( $request );
     867                $data   = array();
     868
     869                if ( in_array( 'id', $fields, true ) ) {
     870                        $data['id'] = (int) $comment->comment_ID;
     871                }
     872
     873                if ( in_array( 'post', $fields, true ) ) {
     874                        $data['post'] = (int) $comment->comment_post_ID;
     875                }
     876
     877                if ( in_array( 'parent', $fields, true ) ) {
     878                        $data['parent'] = (int) $comment->comment_parent;
     879                }
     880
     881                if ( in_array( 'author', $fields, true ) ) {
     882                        $data['author'] = (int) $comment->user_id;
     883                }
     884
     885                if ( in_array( 'author_name', $fields, true ) ) {
     886                        $data['author_name'] = $comment->comment_author;
     887                }
     888
     889                if ( in_array( 'author_email', $fields, true ) ) {
     890                        $data['author_email'] = $comment->comment_author_email;
     891                }
     892
     893                if ( in_array( 'author_url', $fields, true ) ) {
     894                        $data['author_url'] = $comment->comment_author_url;
     895                }
     896
     897                if ( in_array( 'author_ip', $fields, true ) ) {
     898                        $data['author_ip'] = $comment->comment_author_IP;
     899                }
     900
     901                if ( in_array( 'author_user_agent', $fields, true ) ) {
     902                        $data['author_user_agent'] = $comment->comment_agent;
     903                }
     904
     905                if ( in_array( 'date', $fields, true ) ) {
     906                        $data['date'] = mysql_to_rfc3339( $comment->comment_date );
     907                }
     908
     909                if ( in_array( 'date_gmt', $fields, true ) ) {
     910                        $data['date_gmt'] = mysql_to_rfc3339( $comment->comment_date_gmt );
     911                }
     912
     913                if ( in_array( 'content', $fields, true ) ) {
     914                        $data['content'] = array(
    878915                                /** This filter is documented in wp-includes/comment-template.php */
    879916                                'rendered' => apply_filters( 'comment_text', $comment->comment_content, $comment ),
    880917                                'raw'      => $comment->comment_content,
    881                         ),
    882                         'link'              => get_comment_link( $comment ),
    883                         'status'            => $this->prepare_status_response( $comment->comment_approved ),
    884                         'type'              => get_comment_type( $comment->comment_ID ),
    885                 );
     918                        );
     919                }
    886920
    887                 $schema = $this->get_item_schema();
     921                if ( in_array( 'link', $fields, true ) ) {
     922                        $data['link'] = get_comment_link( $comment );
     923                }
     924
     925                if ( in_array( 'status', $fields, true ) ) {
     926                        $data['status'] = $this->prepare_status_response( $comment->comment_approved );
     927                }
     928
     929                if ( in_array( 'type', $fields, true ) ) {
     930                        $data['type'] = get_comment_type( $comment->comment_ID );
     931                }
    888932
    889                 if ( ! empty( $schema['properties']['author_avatar_urls'] ) ) {
     933                if ( in_array( 'author_avatar_urls', $fields, true ) ) {
    890934                        $data['author_avatar_urls'] = rest_get_avatar_urls( $comment->comment_author_email );
    891935                }
    892936
    893                 if ( ! empty( $schema['properties']['meta'] ) ) {
     937                if ( in_array( 'meta', $fields, true ) ) {
    894938                        $data['meta'] = $this->meta->get_value( $comment->comment_ID, $request );
    895939                }
    896940
  • src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php
    index 076d06c0ce..1b9c427946 100644
    a b abstract class WP_REST_Controller { 
    505505                return $schema['title'];
    506506        }
    507507
     508        /**
     509         * Gets an array of fields to be included on the response.
     510         *
     511         * Included fields are based on item schema and `_fields=` request argument.
     512         *
     513         * @since 4.9.6
     514         *
     515         * @param WP_REST_Request $request Full details about the request.
     516         * @return array Fields to be included in the response.
     517         */
     518        public function get_fields_for_response( $request ) {
     519                $schema = $this->get_item_schema();
     520                $fields = isset( $schema['properties'] ) ? array_keys( $schema['properties'] ) : array();
     521                if ( ! isset( $request['_fields'] ) ) {
     522                        return $fields;
     523                }
     524                $requested_fields = is_array( $request['_fields'] ) ? $request['_fields'] : preg_split( '/[\s,]+/', $request['_fields'] );
     525                if ( 0 === count( $requested_fields ) ) {
     526                        return $fields;
     527                }
     528                // Trim off outside whitespace from the comma delimited list.
     529                $requested_fields = array_map( 'trim', $requested_fields );
     530                // Always persist 'id', because it can be needed for add_additional_fields_to_object().
     531                if ( in_array( 'id', $fields, true ) ) {
     532                        $requested_fields[] = 'id';
     533                }
     534                return array_intersect( $fields, $requested_fields );
     535        }
     536
    508537        /**
    509538         * Retrieves an array of endpoint arguments from the item schema for the controller.
    510539         *
  • src/wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php
    index ee9e77a18a..57d41e4795 100644
    a b class WP_REST_Post_Statuses_Controller extends WP_REST_Controller { 
    199199         */
    200200        public function prepare_item_for_response( $status, $request ) {
    201201
    202                 $data = array(
    203                         'name'         => $status->label,
    204                         'private'      => (bool) $status->private,
    205                         'protected'    => (bool) $status->protected,
    206                         'public'       => (bool) $status->public,
    207                         'queryable'    => (bool) $status->publicly_queryable,
    208                         'show_in_list' => (bool) $status->show_in_admin_all_list,
    209                         'slug'         => $status->name,
    210                 );
     202                $fields = $this->get_fields_for_response( $request );
     203                $data   = array();
     204
     205                if ( in_array( 'name', $fields, true ) ) {
     206                        $data['name'] = $status->label;
     207                }
     208
     209                if ( in_array( 'private', $fields, true ) ) {
     210                        $data['private'] = (bool) $status->private;
     211                }
     212
     213                if ( in_array( 'protected', $fields, true ) ) {
     214                        $data['protected'] = (bool) $status->protected;
     215                }
     216
     217                if ( in_array( 'public', $fields, true ) ) {
     218                        $data['public'] = (bool) $status->public;
     219                }
     220
     221                if ( in_array( 'queryable', $fields, true ) ) {
     222                        $data['queryable'] = (bool) $status->publicly_queryable;
     223                }
     224
     225                if ( in_array( 'show_in_list', $fields, true ) ) {
     226                        $data['show_in_list'] = (bool) $status->show_in_admin_all_list;
     227                }
     228
     229                if ( in_array( 'slug', $fields, true ) ) {
     230                        $data['slug'] = $status->name;
     231                }
    211232
    212233                $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
    213234                $data    = $this->add_additional_fields_to_object( $data, $request );
  • src/wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php
    index de0ccab598..5d8fdd903f 100644
    a b class WP_REST_Post_Types_Controller extends WP_REST_Controller { 
    155155                $base       = ! empty( $post_type->rest_base ) ? $post_type->rest_base : $post_type->name;
    156156                $supports   = get_all_post_type_supports( $post_type->name );
    157157
    158                 $data    = array(
    159                         'capabilities' => $post_type->cap,
    160                         'description'  => $post_type->description,
    161                         'hierarchical' => $post_type->hierarchical,
    162                         'viewable'     => is_post_type_viewable( $post_type ),
    163                         'labels'       => $post_type->labels,
    164                         'name'         => $post_type->label,
    165                         'slug'         => $post_type->name,
    166                         'supports'     => $supports,
    167                         'taxonomies'   => array_values( $taxonomies ),
    168                         'rest_base'    => $base,
    169                 );
     158                $fields = $this->get_fields_for_response( $request );
     159                $data   = array();
     160
     161                if ( in_array( 'capabilities', $fields, true ) ) {
     162                        $data['capabilities'] = $post_type->cap;
     163                }
     164
     165                if ( in_array( 'description', $fields, true ) ) {
     166                        $data['description'] = $post_type->description;
     167                }
     168
     169                if ( in_array( 'hierarchical', $fields, true ) ) {
     170                        $data['hierarchical'] = $post_type->hierarchical;
     171                }
     172
     173                if ( in_array( 'viewable', $fields, true ) ) {
     174                        $data['viewable'] = is_post_type_viewable( $post_type );
     175                }
     176
     177                if ( in_array( 'labels', $fields, true ) ) {
     178                        $data['labels'] = $post_type->labels;
     179                }
     180
     181                if ( in_array( 'name', $fields, true ) ) {
     182                        $data['name'] = $post_type->label;
     183                }
     184
     185                if ( in_array( 'slug', $fields, true ) ) {
     186                        $data['slug'] = $post_type->name;
     187                }
     188
     189                if ( in_array( 'supports', $fields, true ) ) {
     190                        $data['supports'] = $supports;
     191                }
     192
     193                if ( in_array( 'taxonomies', $fields, true ) ) {
     194                        $data['taxonomies'] = array_values( $taxonomies );
     195                }
     196
     197                if ( in_array( 'rest_base', $fields, true ) ) {
     198                        $data['rest_base'] = $base;
     199                }
     200
    170201                $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
    171202                $data    = $this->add_additional_fields_to_object( $data, $request );
    172203                $data    = $this->filter_response_by_context( $data, $context );
  • src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
    index 0661152de6..b7b2dd79f6 100644
    a b class WP_REST_Posts_Controller extends WP_REST_Controller { 
    14081408
    14091409                setup_postdata( $post );
    14101410
    1411                 $schema = $this->get_item_schema();
     1411                $fields = $this->get_fields_for_response( $request );
    14121412
    14131413                // Base fields for every post.
    14141414                $data = array();
    14151415
    1416                 if ( ! empty( $schema['properties']['id'] ) ) {
     1416                if ( in_array( 'id', $fields, true ) ) {
    14171417                        $data['id'] = $post->ID;
    14181418                }
    14191419
    1420                 if ( ! empty( $schema['properties']['date'] ) ) {
     1420                if ( in_array( 'date', $fields, true ) ) {
    14211421                        $data['date'] = $this->prepare_date_response( $post->post_date_gmt, $post->post_date );
    14221422                }
    14231423
    1424                 if ( ! empty( $schema['properties']['date_gmt'] ) ) {
     1424                if ( in_array( 'date_gmt', $fields, true ) ) {
    14251425                        // For drafts, `post_date_gmt` may not be set, indicating that the
    14261426                        // date of the draft should be updated each time it is saved (see
    14271427                        // #38883).  In this case, shim the value based on the `post_date`
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    14341434                        $data['date_gmt'] = $this->prepare_date_response( $post_date_gmt );
    14351435                }
    14361436
    1437                 if ( ! empty( $schema['properties']['guid'] ) ) {
     1437                if ( in_array( 'guid', $fields, true ) ) {
    14381438                        $data['guid'] = array(
    14391439                                /** This filter is documented in wp-includes/post-template.php */
    14401440                                'rendered' => apply_filters( 'get_the_guid', $post->guid, $post->ID ),
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    14421442                        );
    14431443                }
    14441444
    1445                 if ( ! empty( $schema['properties']['modified'] ) ) {
     1445                if ( in_array( 'modified', $fields, true ) ) {
    14461446                        $data['modified'] = $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified );
    14471447                }
    14481448
    1449                 if ( ! empty( $schema['properties']['modified_gmt'] ) ) {
     1449                if ( in_array( 'modified_gmt', $fields, true ) ) {
    14501450                        // For drafts, `post_modified_gmt` may not be set (see
    14511451                        // `post_date_gmt` comments above).  In this case, shim the value
    14521452                        // based on the `post_modified` field with the site's timezone
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    14591459                        $data['modified_gmt'] = $this->prepare_date_response( $post_modified_gmt );
    14601460                }
    14611461
    1462                 if ( ! empty( $schema['properties']['password'] ) ) {
     1462                if ( in_array( 'password', $fields, true ) ) {
    14631463                        $data['password'] = $post->post_password;
    14641464                }
    14651465
    1466                 if ( ! empty( $schema['properties']['slug'] ) ) {
     1466                if ( in_array( 'slug', $fields, true ) ) {
    14671467                        $data['slug'] = $post->post_name;
    14681468                }
    14691469
    1470                 if ( ! empty( $schema['properties']['status'] ) ) {
     1470                if ( in_array( 'status', $fields, true ) ) {
    14711471                        $data['status'] = $post->post_status;
    14721472                }
    14731473
    1474                 if ( ! empty( $schema['properties']['type'] ) ) {
     1474                if ( in_array( 'type', $fields, true ) ) {
    14751475                        $data['type'] = $post->post_type;
    14761476                }
    14771477
    1478                 if ( ! empty( $schema['properties']['link'] ) ) {
     1478                if ( in_array( 'link', $fields, true ) ) {
    14791479                        $data['link'] = get_permalink( $post->ID );
    14801480                }
    14811481
    1482                 if ( ! empty( $schema['properties']['title'] ) ) {
     1482                if ( in_array( 'title', $fields, true ) ) {
    14831483                        add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
    14841484
    14851485                        $data['title'] = array(
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    14991499                        $has_password_filter = true;
    15001500                }
    15011501
    1502                 if ( ! empty( $schema['properties']['content'] ) ) {
     1502                if ( in_array( 'content', $fields, true ) ) {
    15031503                        $data['content'] = array(
    15041504                                'raw'       => $post->post_content,
    15051505                                /** This filter is documented in wp-includes/post-template.php */
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    15081508                        );
    15091509                }
    15101510
    1511                 if ( ! empty( $schema['properties']['excerpt'] ) ) {
     1511                if ( in_array( 'excerpt', $fields, true ) ) {
    15121512                        /** This filter is documented in wp-includes/post-template.php */
    15131513                        $excerpt         = apply_filters( 'the_excerpt', apply_filters( 'get_the_excerpt', $post->post_excerpt, $post ) );
    15141514                        $data['excerpt'] = array(
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    15231523                        remove_filter( 'post_password_required', '__return_false' );
    15241524                }
    15251525
    1526                 if ( ! empty( $schema['properties']['author'] ) ) {
     1526                if ( in_array( 'author', $fields, true ) ) {
    15271527                        $data['author'] = (int) $post->post_author;
    15281528                }
    15291529
    1530                 if ( ! empty( $schema['properties']['featured_media'] ) ) {
     1530                if ( in_array( 'featured_media', $fields, true ) ) {
    15311531                        $data['featured_media'] = (int) get_post_thumbnail_id( $post->ID );
    15321532                }
    15331533
    1534                 if ( ! empty( $schema['properties']['parent'] ) ) {
     1534                if ( in_array( 'parent', $fields, true ) ) {
    15351535                        $data['parent'] = (int) $post->post_parent;
    15361536                }
    15371537
    1538                 if ( ! empty( $schema['properties']['menu_order'] ) ) {
     1538                if ( in_array( 'menu_order', $fields, true ) ) {
    15391539                        $data['menu_order'] = (int) $post->menu_order;
    15401540                }
    15411541
    1542                 if ( ! empty( $schema['properties']['comment_status'] ) ) {
     1542                if ( in_array( 'comment_status', $fields, true ) ) {
    15431543                        $data['comment_status'] = $post->comment_status;
    15441544                }
    15451545
    1546                 if ( ! empty( $schema['properties']['ping_status'] ) ) {
     1546                if ( in_array( 'ping_status', $fields, true ) ) {
    15471547                        $data['ping_status'] = $post->ping_status;
    15481548                }
    15491549
    1550                 if ( ! empty( $schema['properties']['sticky'] ) ) {
     1550                if ( in_array( 'sticky', $fields, true ) ) {
    15511551                        $data['sticky'] = is_sticky( $post->ID );
    15521552                }
    15531553
    1554                 if ( ! empty( $schema['properties']['template'] ) ) {
     1554                if ( in_array( 'template', $fields, true ) ) {
    15551555                        if ( $template = get_page_template_slug( $post->ID ) ) {
    15561556                                $data['template'] = $template;
    15571557                        } else {
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    15591559                        }
    15601560                }
    15611561
    1562                 if ( ! empty( $schema['properties']['format'] ) ) {
     1562                if ( in_array( 'format', $fields, true ) ) {
    15631563                        $data['format'] = get_post_format( $post->ID );
    15641564
    15651565                        // Fill in blank post format.
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    15681568                        }
    15691569                }
    15701570
    1571                 if ( ! empty( $schema['properties']['meta'] ) ) {
     1571                if ( in_array( 'meta', $fields, true ) ) {
    15721572                        $data['meta'] = $this->meta->get_value( $post->ID, $request );
    15731573                }
    15741574
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    15771577                foreach ( $taxonomies as $taxonomy ) {
    15781578                        $base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
    15791579
    1580                         if ( ! empty( $schema['properties'][ $base ] ) ) {
     1580                        if ( in_array( $base, $fields, true ) ) {
    15811581                                $terms         = get_the_terms( $post, $taxonomy->name );
    15821582                                $data[ $base ] = $terms ? array_values( wp_list_pluck( $terms, 'term_id' ) ) : array();
    15831583                        }
  • src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php
    index 471c4c4b4f..60a1910278 100644
    a b class WP_REST_Revisions_Controller extends WP_REST_Controller { 
    340340
    341341                setup_postdata( $post );
    342342
    343                 $schema = $this->get_item_schema();
     343                $fields = $this->get_fields_for_response( $request );
     344                $data   = array();
    344345
    345                 $data = array();
    346 
    347                 if ( ! empty( $schema['properties']['author'] ) ) {
     346                if ( in_array( 'author', $fields, true ) ) {
    348347                        $data['author'] = (int) $post->post_author;
    349348                }
    350349
    351                 if ( ! empty( $schema['properties']['date'] ) ) {
     350                if ( in_array( 'date', $fields, true ) ) {
    352351                        $data['date'] = $this->prepare_date_response( $post->post_date_gmt, $post->post_date );
    353352                }
    354353
    355                 if ( ! empty( $schema['properties']['date_gmt'] ) ) {
     354                if ( in_array( 'date_gmt', $fields, true ) ) {
    356355                        $data['date_gmt'] = $this->prepare_date_response( $post->post_date_gmt );
    357356                }
    358357
    359                 if ( ! empty( $schema['properties']['id'] ) ) {
     358                if ( in_array( 'id', $fields, true ) ) {
    360359                        $data['id'] = $post->ID;
    361360                }
    362361
    363                 if ( ! empty( $schema['properties']['modified'] ) ) {
     362                if ( in_array( 'modified', $fields, true ) ) {
    364363                        $data['modified'] = $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified );
    365364                }
    366365
    367                 if ( ! empty( $schema['properties']['modified_gmt'] ) ) {
     366                if ( in_array( 'modified_gmt', $fields, true ) ) {
    368367                        $data['modified_gmt'] = $this->prepare_date_response( $post->post_modified_gmt );
    369368                }
    370369
    371                 if ( ! empty( $schema['properties']['parent'] ) ) {
     370                if ( in_array( 'parent', $fields, true ) ) {
    372371                        $data['parent'] = (int) $post->post_parent;
    373372                }
    374373
    375                 if ( ! empty( $schema['properties']['slug'] ) ) {
     374                if ( in_array( 'slug', $fields, true ) ) {
    376375                        $data['slug'] = $post->post_name;
    377376                }
    378377
    379                 if ( ! empty( $schema['properties']['guid'] ) ) {
     378                if ( in_array( 'guid', $fields, true ) ) {
    380379                        $data['guid'] = array(
    381380                                /** This filter is documented in wp-includes/post-template.php */
    382381                                'rendered' => apply_filters( 'get_the_guid', $post->guid, $post->ID ),
    class WP_REST_Revisions_Controller extends WP_REST_Controller { 
    384383                        );
    385384                }
    386385
    387                 if ( ! empty( $schema['properties']['title'] ) ) {
     386                if ( in_array( 'title', $fields, true ) ) {
    388387                        $data['title'] = array(
    389388                                'raw'      => $post->post_title,
    390389                                'rendered' => get_the_title( $post->ID ),
    391390                        );
    392391                }
    393392
    394                 if ( ! empty( $schema['properties']['content'] ) ) {
     393                if ( in_array( 'content', $fields, true ) ) {
    395394
    396395                        $data['content'] = array(
    397396                                'raw'      => $post->post_content,
    class WP_REST_Revisions_Controller extends WP_REST_Controller { 
    400399                        );
    401400                }
    402401
    403                 if ( ! empty( $schema['properties']['excerpt'] ) ) {
     402                if ( in_array( 'excerpt', $fields, true ) ) {
    404403                        $data['excerpt'] = array(
    405404                                'raw'      => $post->post_excerpt,
    406405                                'rendered' => $this->prepare_excerpt_response( $post->post_excerpt, $post ),
  • src/wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php
    index d72bafd608..e431d4b743 100644
    a b class WP_REST_Taxonomies_Controller extends WP_REST_Controller { 
    181181         */
    182182        public function prepare_item_for_response( $taxonomy, $request ) {
    183183                $base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
    184                 $data = array(
    185                         'name'         => $taxonomy->label,
    186                         'slug'         => $taxonomy->name,
    187                         'capabilities' => $taxonomy->cap,
    188                         'description'  => $taxonomy->description,
    189                         'labels'       => $taxonomy->labels,
    190                         'types'        => $taxonomy->object_type,
    191                         'show_cloud'   => $taxonomy->show_tagcloud,
    192                         'hierarchical' => $taxonomy->hierarchical,
    193                         'rest_base'    => $base,
    194                         'visibility'   => array(
     184
     185                $fields = $this->get_fields_for_response( $request );
     186                $data   = array();
     187
     188                if ( in_array( 'name', $fields, true ) ) {
     189                        $data['name'] = $taxonomy->label;
     190                }
     191
     192                if ( in_array( 'slug', $fields, true ) ) {
     193                        $data['slug'] = $taxonomy->name;
     194                }
     195
     196                if ( in_array( 'capabilities', $fields, true ) ) {
     197                        $data['capabilities'] = $taxonomy->cap;
     198                }
     199
     200                if ( in_array( 'description', $fields, true ) ) {
     201                        $data['description'] = $taxonomy->description;
     202                }
     203
     204                if ( in_array( 'labels', $fields, true ) ) {
     205                        $data['labels'] = $taxonomy->labels;
     206                }
     207
     208                if ( in_array( 'types', $fields, true ) ) {
     209                        $data['types'] = $taxonomy->object_type;
     210                }
     211
     212                if ( in_array( 'show_cloud', $fields, true ) ) {
     213                        $data['show_cloud'] = $taxonomy->show_tagcloud;
     214                }
     215
     216                if ( in_array( 'hierarchical', $fields, true ) ) {
     217                        $data['hierarchical'] = $taxonomy->hierarchical;
     218                }
     219
     220                if ( in_array( 'rest_base', $fields, true ) ) {
     221                        $data['rest_base'] = $base;
     222                }
     223
     224                if ( in_array( 'visibility', $fields, true ) ) {
     225                        $data['visibility'] = array(
    195226                                'public'             => (bool) $taxonomy->public,
    196227                                'publicly_queryable' => (bool) $taxonomy->publicly_queryable,
    197228                                'show_admin_column'  => (bool) $taxonomy->show_admin_column,
    198229                                'show_in_nav_menus'  => (bool) $taxonomy->show_in_nav_menus,
    199230                                'show_in_quick_edit' => (bool) $taxonomy->show_in_quick_edit,
    200231                                'show_ui'            => (bool) $taxonomy->show_ui,
    201                         ),
    202                 );
     232                        );
     233                }
    203234
    204235                $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
    205236                $data    = $this->add_additional_fields_to_object( $data, $request );
  • src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php
    index 5a844bdfce..ea2d0d19a7 100644
    a b class WP_REST_Terms_Controller extends WP_REST_Controller { 
    691691         */
    692692        public function prepare_item_for_response( $item, $request ) {
    693693
    694                 $schema = $this->get_item_schema();
     694                $fields = $this->get_fields_for_response( $request );
    695695                $data   = array();
    696696
    697                 if ( ! empty( $schema['properties']['id'] ) ) {
     697                if ( in_array( 'id', $fields, true ) ) {
    698698                        $data['id'] = (int) $item->term_id;
    699699                }
    700700
    701                 if ( ! empty( $schema['properties']['count'] ) ) {
     701                if ( in_array( 'count', $fields, true ) ) {
    702702                        $data['count'] = (int) $item->count;
    703703                }
    704704
    705                 if ( ! empty( $schema['properties']['description'] ) ) {
     705                if ( in_array( 'description', $fields, true ) ) {
    706706                        $data['description'] = $item->description;
    707707                }
    708708
    709                 if ( ! empty( $schema['properties']['link'] ) ) {
     709                if ( in_array( 'link', $fields, true ) ) {
    710710                        $data['link'] = get_term_link( $item );
    711711                }
    712712
    713                 if ( ! empty( $schema['properties']['name'] ) ) {
     713                if ( in_array( 'name', $fields, true ) ) {
    714714                        $data['name'] = $item->name;
    715715                }
    716716
    717                 if ( ! empty( $schema['properties']['slug'] ) ) {
     717                if ( in_array( 'slug', $fields, true ) ) {
    718718                        $data['slug'] = $item->slug;
    719719                }
    720720
    721                 if ( ! empty( $schema['properties']['taxonomy'] ) ) {
     721                if ( in_array( 'taxonomy', $fields, true ) ) {
    722722                        $data['taxonomy'] = $item->taxonomy;
    723723                }
    724724
    725                 if ( ! empty( $schema['properties']['parent'] ) ) {
     725                if ( in_array( 'parent', $fields, true ) ) {
    726726                        $data['parent'] = (int) $item->parent;
    727727                }
    728728
    729                 if ( ! empty( $schema['properties']['meta'] ) ) {
     729                if ( in_array( 'meta', $fields, true ) ) {
    730730                        $data['meta'] = $this->meta->get_value( $item->term_id, $request );
    731731                }
    732732
  • src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php
    index 78062617fd..c452b30472 100644
    a b class WP_REST_Users_Controller extends WP_REST_Controller { 
    846846        public function prepare_item_for_response( $user, $request ) {
    847847
    848848                $data   = array();
    849                 $schema = $this->get_item_schema();
     849                $fields = $this->get_fields_for_response( $request );
    850850
    851                 if ( ! empty( $schema['properties']['id'] ) ) {
     851                if ( in_array( 'id', $fields, true ) ) {
    852852                        $data['id'] = $user->ID;
    853853                }
    854854
    855                 if ( ! empty( $schema['properties']['username'] ) ) {
     855                if ( in_array( 'username', $fields, true ) ) {
    856856                        $data['username'] = $user->user_login;
    857857                }
    858858
    859                 if ( ! empty( $schema['properties']['name'] ) ) {
     859                if ( in_array( 'name', $fields, true ) ) {
    860860                        $data['name'] = $user->display_name;
    861861                }
    862862
    863                 if ( ! empty( $schema['properties']['first_name'] ) ) {
     863                if ( in_array( 'first_name', $fields, true ) ) {
    864864                        $data['first_name'] = $user->first_name;
    865865                }
    866866
    867                 if ( ! empty( $schema['properties']['last_name'] ) ) {
     867                if ( in_array( 'last_name', $fields, true ) ) {
    868868                        $data['last_name'] = $user->last_name;
    869869                }
    870870
    871                 if ( ! empty( $schema['properties']['email'] ) ) {
     871                if ( in_array( 'email', $fields, true ) ) {
    872872                        $data['email'] = $user->user_email;
    873873                }
    874874
    875                 if ( ! empty( $schema['properties']['url'] ) ) {
     875                if ( in_array( 'url', $fields, true ) ) {
    876876                        $data['url'] = $user->user_url;
    877877                }
    878878
    879                 if ( ! empty( $schema['properties']['description'] ) ) {
     879                if ( in_array( 'description', $fields, true ) ) {
    880880                        $data['description'] = $user->description;
    881881                }
    882882
    883                 if ( ! empty( $schema['properties']['link'] ) ) {
     883                if ( in_array( 'link', $fields, true ) ) {
    884884                        $data['link'] = get_author_posts_url( $user->ID, $user->user_nicename );
    885885                }
    886886
    887                 if ( ! empty( $schema['properties']['locale'] ) ) {
     887                if ( in_array( 'locale', $fields, true ) ) {
    888888                        $data['locale'] = get_user_locale( $user );
    889889                }
    890890
    891                 if ( ! empty( $schema['properties']['nickname'] ) ) {
     891                if ( in_array( 'nickname', $fields, true ) ) {
    892892                        $data['nickname'] = $user->nickname;
    893893                }
    894894
    895                 if ( ! empty( $schema['properties']['slug'] ) ) {
     895                if ( in_array( 'slug', $fields, true ) ) {
    896896                        $data['slug'] = $user->user_nicename;
    897897                }
    898898
    899                 if ( ! empty( $schema['properties']['roles'] ) ) {
     899                if ( in_array( 'roles', $fields, true ) ) {
    900900                        // Defensively call array_values() to ensure an array is returned.
    901901                        $data['roles'] = array_values( $user->roles );
    902902                }
    903903
    904                 if ( ! empty( $schema['properties']['registered_date'] ) ) {
     904                if ( in_array( 'registered_date', $fields, true ) ) {
    905905                        $data['registered_date'] = date( 'c', strtotime( $user->user_registered ) );
    906906                }
    907907
    908                 if ( ! empty( $schema['properties']['capabilities'] ) ) {
     908                if ( in_array( 'capabilities', $fields, true ) ) {
    909909                        $data['capabilities'] = (object) $user->allcaps;
    910910                }
    911911
    912                 if ( ! empty( $schema['properties']['extra_capabilities'] ) ) {
     912                if ( in_array( 'extra_capabilities', $fields, true ) ) {
    913913                        $data['extra_capabilities'] = (object) $user->caps;
    914914                }
    915915
    916                 if ( ! empty( $schema['properties']['avatar_urls'] ) ) {
     916                if ( in_array( 'avatar_urls', $fields, true ) ) {
    917917                        $data['avatar_urls'] = rest_get_avatar_urls( $user->user_email );
    918918                }
    919919
    920                 if ( ! empty( $schema['properties']['meta'] ) ) {
     920                if ( in_array( 'meta', $fields, true ) ) {
    921921                        $data['meta'] = $this->meta->get_value( $user->ID, $request );
    922922                }
    923923
  • tests/phpunit/tests/rest-api/rest-attachments-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-attachments-controller.php b/tests/phpunit/tests/rest-api/rest-attachments-controller.php
    index 1136ac2cf2..c42e40f194 100644
    a b class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control 
    11781178                $this->check_post_data( $attachment, $data, 'embed', $response->get_links() );
    11791179        }
    11801180
     1181        public function test_prepare_item_limit_fields() {
     1182                $attachment_id = $this->factory->attachment->create_object(
     1183                        $this->test_file, 0, array(
     1184                                'post_mime_type' => 'image/jpeg',
     1185                                'post_excerpt'   => 'A sample caption',
     1186                                'post_author'    => self::$editor_id,
     1187                        )
     1188                );
     1189                wp_set_current_user( self::$editor_id );
     1190                $endpoint = new WP_REST_Attachments_Controller( 'post' );
     1191                $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/media/%d', $attachment_id ) );
     1192                $request->set_param( 'context', 'edit' );
     1193                $request->set_param( '_fields', 'id,slug' );
     1194                $obj      = get_post( $attachment_id );
     1195                $response = $endpoint->prepare_item_for_response( $obj, $request );
     1196                $this->assertEquals( array(
     1197                        'id',
     1198                        'slug',
     1199                ), array_keys( $response->get_data() ) );
     1200        }
     1201
    11811202        public function test_get_item_schema() {
    11821203                $request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/media' );
    11831204                $response   = rest_get_server()->dispatch( $request );
  • tests/phpunit/tests/rest-api/rest-categories-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-categories-controller.php b/tests/phpunit/tests/rest-api/rest-categories-controller.php
    index 2ef94d6e8a..2e01943158 100644
    a b class WP_Test_REST_Categories_Controller extends WP_Test_REST_Controller_Testcas 
    882882                $this->check_taxonomy_term( $term, $data, $response->get_links() );
    883883        }
    884884
     885        public function test_prepare_item_limit_fields() {
     886                $request  = new WP_REST_Request;
     887                $endpoint = new WP_REST_Terms_Controller( 'category' );
     888                $request->set_param( '_fields', 'id,name' );
     889                $term     = get_term( 1, 'category' );
     890                $response = $endpoint->prepare_item_for_response( $term, $request );
     891                $this->assertEquals( array(
     892                        'id',
     893                        'name',
     894                ), array_keys( $response->get_data() ) );
     895        }
     896
    885897        public function test_prepare_taxonomy_term_child() {
    886898                $child = $this->factory->category->create(
    887899                        array(
  • tests/phpunit/tests/rest-api/rest-comments-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-comments-controller.php b/tests/phpunit/tests/rest-api/rest-comments-controller.php
    index b0538c3faf..1e1a23fbeb 100644
    a b class WP_Test_REST_Comments_Controller extends WP_Test_REST_Controller_Testcase 
    847847                $this->check_comment_data( $data, 'edit', $response->get_links() );
    848848        }
    849849
     850        public function test_prepare_item_limit_fields() {
     851                wp_set_current_user( self::$admin_id );
     852                $endpoint = new WP_REST_Comments_Controller;
     853                $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
     854                $request->set_param( 'context', 'edit' );
     855                $request->set_param( '_fields', 'id,status' );
     856                $obj      = get_comment( self::$approved_id );
     857                $response = $endpoint->prepare_item_for_response( $obj, $request );
     858                $this->assertEquals( array(
     859                        'id',
     860                        'status',
     861                ), array_keys( $response->get_data() ) );
     862        }
     863
    850864        public function test_get_comment_author_avatar_urls() {
    851865                $request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
    852866
  • tests/phpunit/tests/rest-api/rest-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-controller.php b/tests/phpunit/tests/rest-api/rest-controller.php
    index 4d73d0fa38..e4dc15fede 100644
    a b class WP_Test_REST_Controller extends WP_Test_REST_TestCase { 
    200200
    201201                $this->assertEquals( 'a', $args['somedefault']['default'] );
    202202        }
     203
     204        public function test_get_fields_for_response() {
     205                $controller = new WP_REST_Test_Controller();
     206                $request    = new WP_REST_Request( 'GET', '/wp/v2/testroute' );
     207                $fields     = $controller->get_fields_for_response( $request );
     208                $this->assertEquals( array(
     209                        'somestring',
     210                        'someinteger',
     211                        'someboolean',
     212                        'someurl',
     213                        'somedate',
     214                        'someemail',
     215                        'someenum',
     216                        'someargoptions',
     217                        'somedefault',
     218                ), $fields );
     219                $request->set_param( '_fields', 'somestring,someinteger' );
     220                $fields = $controller->get_fields_for_response( $request );
     221                $this->assertEquals( array(
     222                        'somestring',
     223                        'someinteger',
     224                ), $fields );
     225        }
    203226}
  • tests/phpunit/tests/rest-api/rest-pages-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-pages-controller.php b/tests/phpunit/tests/rest-api/rest-pages-controller.php
    index e64096140f..dcc7c15297 100644
    a b class WP_Test_REST_Pages_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    451451
    452452        }
    453453
     454        public function test_prepare_item_limit_fields() {
     455                wp_set_current_user( self::$editor_id );
     456                $page_id  = $this->factory->post->create(
     457                        array(
     458                                'post_status' => 'publish',
     459                                'post_type'   => 'page',
     460                        )
     461                );
     462                $endpoint = new WP_REST_Posts_Controller( 'page' );
     463                $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/pages/%d', $page_id ) );
     464                $request->set_param( 'context', 'edit' );
     465                $request->set_param( '_fields', 'id,slug' );
     466                $obj      = get_post( $page_id );
     467                $response = $endpoint->prepare_item_for_response( $obj, $request );
     468                $this->assertEquals( array(
     469                        'id',
     470                        'slug',
     471                ), array_keys( $response->get_data() ) );
     472        }
     473
    454474        public function test_get_pages_params() {
    455475                $this->factory->post->create_many(
    456476                        8, array(
  • tests/phpunit/tests/rest-api/rest-post-statuses-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-post-statuses-controller.php b/tests/phpunit/tests/rest-api/rest-post-statuses-controller.php
    index 7d123b9c61..6cb74011b5 100644
    a b class WP_Test_REST_Post_Statuses_Controller extends WP_Test_REST_Controller_Test 
    131131                $this->check_post_status_obj( $obj, $data->get_data(), $data->get_links() );
    132132        }
    133133
     134        public function test_prepare_item_limit_fields() {
     135                $obj      = get_post_status_object( 'publish' );
     136                $request  = new WP_REST_Request;
     137                $endpoint = new WP_REST_Post_Statuses_Controller;
     138                $request->set_param( 'context', 'edit' );
     139                $request->set_param( '_fields', 'id,name' );
     140                $response = $endpoint->prepare_item_for_response( $obj, $request );
     141                $this->assertEquals( array(
     142                        // 'id' doesn't exist in this context.
     143                        'name',
     144                ), array_keys( $response->get_data() ) );
     145        }
     146
    134147        public function test_get_item_schema() {
    135148                $request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/statuses' );
    136149                $response   = rest_get_server()->dispatch( $request );
  • tests/phpunit/tests/rest-api/rest-post-types-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-post-types-controller.php b/tests/phpunit/tests/rest-api/rest-post-types-controller.php
    index 8ef7f4202c..efefec292b 100644
    a b class WP_Test_REST_Post_Types_Controller extends WP_Test_REST_Controller_Testcas 
    123123                $this->check_post_type_obj( 'edit', $obj, $response->get_data(), $response->get_links() );
    124124        }
    125125
     126        public function test_prepare_item_limit_fields() {
     127                $obj      = get_post_type_object( 'post' );
     128                $request  = new WP_REST_Request;
     129                $endpoint = new WP_REST_Post_Types_Controller;
     130                $request->set_param( 'context', 'edit' );
     131                $request->set_param( '_fields', 'id,name' );
     132                $response = $endpoint->prepare_item_for_response( $obj, $request );
     133                $this->assertEquals( array(
     134                        // 'id' doesn't exist in this context.
     135                        'name',
     136                ), array_keys( $response->get_data() ) );
     137        }
     138
    126139        public function test_get_item_schema() {
    127140                $request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/types' );
    128141                $response   = rest_get_server()->dispatch( $request );
  • tests/phpunit/tests/rest-api/rest-posts-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php
    index 5152399f21..721b08292a 100644
    a b class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    14991499                $this->check_get_post_response( $response, 'edit' );
    15001500        }
    15011501
     1502        public function test_prepare_item_limit_fields() {
     1503                wp_set_current_user( self::$editor_id );
     1504                $endpoint = new WP_REST_Posts_Controller( 'post' );
     1505                $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     1506                $request->set_param( 'context', 'edit' );
     1507                $request->set_param( '_fields', 'id,slug' );
     1508                $obj      = get_post( self::$post_id );
     1509                $response = $endpoint->prepare_item_for_response( $obj, $request );
     1510                $this->assertEquals( array(
     1511                        'id',
     1512                        'slug',
     1513                ), array_keys( $response->get_data() ) );
     1514        }
     1515
    15021516        public function test_create_item() {
    15031517                wp_set_current_user( self::$editor_id );
    15041518
  • tests/phpunit/tests/rest-api/rest-revisions-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-revisions-controller.php b/tests/phpunit/tests/rest-api/rest-revisions-controller.php
    index c30ab17c85..f211e4db88 100644
    a b class WP_Test_REST_Revisions_Controller extends WP_Test_REST_Controller_Testcase 
    237237                $this->check_get_revision_response( $response, $this->revision_1 );
    238238        }
    239239
     240        public function test_prepare_item_limit_fields() {
     241                wp_set_current_user( self::$editor_id );
     242                $request  = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions/' . $this->revision_id1 );
     243                $endpoint = new WP_REST_Revisions_Controller( 'post' );
     244                $request->set_param( 'context', 'edit' );
     245                $request->set_param( '_fields', 'id,slug' );
     246                $revision = get_post( $this->revision_id1 );
     247                $response = $endpoint->prepare_item_for_response( $revision, $request );
     248                $this->assertEquals( array(
     249                        'id',
     250                        'slug',
     251                ), array_keys( $response->get_data() ) );
     252        }
     253
    240254        public function test_get_item_schema() {
    241255                $request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/posts/' . self::$post_id . '/revisions' );
    242256                $response   = rest_get_server()->dispatch( $request );
  • tests/phpunit/tests/rest-api/rest-tags-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-tags-controller.php b/tests/phpunit/tests/rest-api/rest-tags-controller.php
    index e56e92268d..f2cd6a74a8 100644
    a b class WP_Test_REST_Tags_Controller extends WP_Test_REST_Controller_Testcase { 
    968968                $this->check_taxonomy_term( $term, $data, $response->get_links() );
    969969        }
    970970
     971        public function test_prepare_item_limit_fields() {
     972                $request  = new WP_REST_Request;
     973                $endpoint = new WP_REST_Terms_Controller( 'post_tag' );
     974                $request->set_param( '_fields', 'id,name' );
     975                $term     = get_term_by( 'id', $this->factory->tag->create(), 'post_tag' );
     976                $response = $endpoint->prepare_item_for_response( $term, $request );
     977                $this->assertEquals( array(
     978                        'id',
     979                        'name',
     980                ), array_keys( $response->get_data() ) );
     981        }
     982
    971983        public function test_get_item_schema() {
    972984                $request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/tags' );
    973985                $response   = rest_get_server()->dispatch( $request );
  • tests/phpunit/tests/rest-api/rest-taxonomies-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-taxonomies-controller.php b/tests/phpunit/tests/rest-api/rest-taxonomies-controller.php
    index 01f4460a36..635969cb38 100644
    a b class WP_Test_REST_Taxonomies_Controller extends WP_Test_REST_Controller_Testcas 
    162162                $this->check_taxonomy_object( 'edit', $tax, $response->get_data(), $response->get_links() );
    163163        }
    164164
     165        public function test_prepare_item_limit_fields() {
     166                $tax      = get_taxonomy( 'category' );
     167                $request  = new WP_REST_Request;
     168                $endpoint = new WP_REST_Taxonomies_Controller;
     169                $request->set_param( 'context', 'edit' );
     170                $request->set_param( '_fields', 'id,name' );
     171                $response = $endpoint->prepare_item_for_response( $tax, $request );
     172                $this->assertEquals( array(
     173                        // 'id' doesn't exist in this context.
     174                        'name',
     175                ), array_keys( $response->get_data() ) );
     176        }
     177
    165178        public function test_get_item_schema() {
    166179                $request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/taxonomies' );
    167180                $response   = rest_get_server()->dispatch( $request );
  • tests/phpunit/tests/rest-api/rest-users-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-users-controller.php b/tests/phpunit/tests/rest-api/rest-users-controller.php
    index 77b4474cf7..0d3960b1c0 100644
    a b class WP_Test_REST_Users_Controller extends WP_Test_REST_Controller_Testcase { 
    849849                $this->check_get_user_response( $data, 'edit' );
    850850        }
    851851
     852        public function test_prepare_item_limit_fields() {
     853                wp_set_current_user( self::$user );
     854                $request = new WP_REST_Request;
     855                $request->set_param( 'context', 'edit' );
     856                $request->set_param( '_fields', 'id,name' );
     857                $user     = get_user_by( 'id', get_current_user_id() );
     858                $response = $this->endpoint->prepare_item_for_response( $user, $request );
     859                $this->assertEquals( array(
     860                        'id',
     861                        'name',
     862                ), array_keys( $response->get_data() ) );
     863        }
     864
    852865        public function test_get_user_avatar_urls() {
    853866                wp_set_current_user( self::$user );
    854867