WordPress.org

Make WordPress Core

Changeset 43445


Ignore:
Timestamp:
07/13/2018 06:50:51 AM (3 years ago)
Author:
pento
Message:

REST API: Filter responses based on the _fields parameter, before data is processed.

Historically, the REST API would generate the entire response object, including running expensive filters, then it would apply the _fields parameter, discarding the fields that weren't specificed.

This change causes _fields to be applied earlier, so that only requested fields are processed.

Merges [43087] to the 4.9 branch.

Props danielbachhuber.
See #43874.

Location:
branches/4.9
Files:
23 edited

Legend:

Unmodified
Added
Removed
  • branches/4.9

  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

    r43438 r43445  
    285285    public function prepare_item_for_response( $post, $request ) {
    286286        $response = parent::prepare_item_for_response( $post, $request );
    287         $data = $response->get_data();
    288 
    289         $data['description'] = array(
    290             'raw'       => $post->post_content,
     287        $fields   = $this->get_fields_for_response( $request );
     288        $data     = $response->get_data();
     289
     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         );
    294 
    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         );
    301 
    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 );
    308 
    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'] ) ) {
    313 
    314             foreach ( $data['media_details']['sizes'] as $size => &$size_data ) {
    315 
    316                 if ( isset( $size_data['mime-type'] ) ) {
    317                     $size_data['mime_type'] = $size_data['mime-type'];
    318                     unset( $size_data['mime-type'] );
     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        }
     306
     307        if ( in_array( 'alt_text', $fields, true ) ) {
     308            $data['alt_text'] = get_post_meta( $post->ID, '_wp_attachment_image_alt', true );
     309        }
     310
     311        if ( in_array( 'media_type', $fields, true ) ) {
     312            $data['media_type'] = wp_attachment_is_image( $post->ID ) ? 'image' : 'file';
     313        }
     314
     315        if ( in_array( 'mime_type', $fields, true ) ) {
     316            $data['mime_type'] = $post->post_mime_type;
     317        }
     318
     319        if ( in_array( 'media_details', $fields, true ) ) {
     320            $data['media_details'] = wp_get_attachment_metadata( $post->ID );
     321
     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'] ) ) {
     326
     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];
    319341                }
    320342
    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;
     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                    );
    325353                }
    326 
    327                 $size_data['source_url'] = $image_src[0];
    328             }
    329 
    330             $full_src = wp_get_attachment_image_src( $post->ID, 'full' );
    331 
    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;
     354            } else {
     355                $data['media_details']['sizes'] = new stdClass;
     356            }
     357        }
     358
     359        if ( in_array( 'post', $fields, true ) ) {
     360            $data['post'] = ! empty( $post->post_parent ) ? (int) $post->post_parent : null;
     361        }
     362
     363        if ( in_array( 'source_url', $fields, true ) ) {
     364            $data['source_url'] = wp_get_attachment_url( $post->ID );
    343365        }
    344366
  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php

    r41735 r43445  
    852852     */
    853853    public function prepare_item_for_response( $comment, $request ) {
    854         $data = array(
    855             'id'                 => (int) $comment->comment_ID,
    856             'post'               => (int) $comment->comment_post_ID,
    857             'parent'             => (int) $comment->comment_parent,
    858             'author'             => (int) $comment->user_id,
    859             'author_name'        => $comment->comment_author,
    860             'author_email'       => $comment->comment_author_email,
    861             'author_url'         => $comment->comment_author_url,
    862             'author_ip'          => $comment->comment_author_IP,
    863             'author_user_agent'  => $comment->comment_agent,
    864             'date'               => mysql_to_rfc3339( $comment->comment_date ),
    865             'date_gmt'           => mysql_to_rfc3339( $comment->comment_date_gmt ),
    866             'content'            => array(
     854
     855        $fields = $this->get_fields_for_response( $request );
     856        $data   = array();
     857
     858        if ( in_array( 'id', $fields, true ) ) {
     859            $data['id'] = (int) $comment->comment_ID;
     860        }
     861
     862        if ( in_array( 'post', $fields, true ) ) {
     863            $data['post'] = (int) $comment->comment_post_ID;
     864        }
     865
     866        if ( in_array( 'parent', $fields, true ) ) {
     867            $data['parent'] = (int) $comment->comment_parent;
     868        }
     869
     870        if ( in_array( 'author', $fields, true ) ) {
     871            $data['author'] = (int) $comment->user_id;
     872        }
     873
     874        if ( in_array( 'author_name', $fields, true ) ) {
     875            $data['author_name'] = $comment->comment_author;
     876        }
     877
     878        if ( in_array( 'author_email', $fields, true ) ) {
     879            $data['author_email'] = $comment->comment_author_email;
     880        }
     881
     882        if ( in_array( 'author_url', $fields, true ) ) {
     883            $data['author_url'] = $comment->comment_author_url;
     884        }
     885
     886        if ( in_array( 'author_ip', $fields, true ) ) {
     887            $data['author_ip'] = $comment->comment_author_IP;
     888        }
     889
     890        if ( in_array( 'author_user_agent', $fields, true ) ) {
     891            $data['author_user_agent'] = $comment->comment_agent;
     892        }
     893
     894        if ( in_array( 'date', $fields, true ) ) {
     895            $data['date'] = mysql_to_rfc3339( $comment->comment_date );
     896        }
     897
     898        if ( in_array( 'date_gmt', $fields, true ) ) {
     899            $data['date_gmt'] = mysql_to_rfc3339( $comment->comment_date_gmt );
     900        }
     901
     902        if ( in_array( 'content', $fields, true ) ) {
     903            $data['content'] = array(
    867904                /** This filter is documented in wp-includes/comment-template.php */
    868905                'rendered' => apply_filters( 'comment_text', $comment->comment_content, $comment ),
    869906                'raw'      => $comment->comment_content,
    870             ),
    871             'link'               => get_comment_link( $comment ),
    872             'status'             => $this->prepare_status_response( $comment->comment_approved ),
    873             'type'               => get_comment_type( $comment->comment_ID ),
    874         );
    875 
    876         $schema = $this->get_item_schema();
    877 
    878         if ( ! empty( $schema['properties']['author_avatar_urls'] ) ) {
     907            );
     908        }
     909
     910        if ( in_array( 'link', $fields, true ) ) {
     911            $data['link'] = get_comment_link( $comment );
     912        }
     913
     914        if ( in_array( 'status', $fields, true ) ) {
     915            $data['status'] = $this->prepare_status_response( $comment->comment_approved );
     916        }
     917
     918        if ( in_array( 'type', $fields, true ) ) {
     919            $data['type'] = get_comment_type( $comment->comment_ID );
     920        }
     921
     922        if ( in_array( 'author_avatar_urls', $fields, true ) ) {
    879923            $data['author_avatar_urls'] = rest_get_avatar_urls( $comment->comment_author_email );
    880924        }
    881925
    882         if ( ! empty( $schema['properties']['meta'] ) ) {
     926        if ( in_array( 'meta', $fields, true ) ) {
    883927            $data['meta'] = $this->meta->get_value( $comment->comment_ID, $request );
    884928        }
  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php

    r42000 r43445  
    507507
    508508    /**
     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
     537    /**
    509538     * Retrieves an array of endpoint arguments from the item schema for the controller.
    510539     *
  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php

    r41731 r43445  
    196196    public function prepare_item_for_response( $status, $request ) {
    197197
    198         $data = array(
    199             'name'         => $status->label,
    200             'private'      => (bool) $status->private,
    201             'protected'    => (bool) $status->protected,
    202             'public'       => (bool) $status->public,
    203             'queryable'    => (bool) $status->publicly_queryable,
    204             'show_in_list' => (bool) $status->show_in_admin_all_list,
    205             'slug'         => $status->name,
    206         );
     198        $fields = $this->get_fields_for_response( $request );
     199        $data   = array();
     200
     201        if ( in_array( 'name', $fields, true ) ) {
     202            $data['name'] = $status->label;
     203        }
     204
     205        if ( in_array( 'private', $fields, true ) ) {
     206            $data['private'] = (bool) $status->private;
     207        }
     208
     209        if ( in_array( 'protected', $fields, true ) ) {
     210            $data['protected'] = (bool) $status->protected;
     211        }
     212
     213        if ( in_array( 'public', $fields, true ) ) {
     214            $data['public'] = (bool) $status->public;
     215        }
     216
     217        if ( in_array( 'queryable', $fields, true ) ) {
     218            $data['queryable'] = (bool) $status->publicly_queryable;
     219        }
     220
     221        if ( in_array( 'show_in_list', $fields, true ) ) {
     222            $data['show_in_list'] = (bool) $status->show_in_admin_all_list;
     223        }
     224
     225        if ( in_array( 'slug', $fields, true ) ) {
     226            $data['slug'] = $status->name;
     227        }
    207228
    208229        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php

    r43038 r43445  
    152152        $supports = get_all_post_type_supports( $post_type->name );
    153153
    154         $data = array(
    155             'capabilities' => $post_type->cap,
    156             'description'  => $post_type->description,
    157             'hierarchical' => $post_type->hierarchical,
    158             'viewable'     => is_post_type_viewable( $post_type ),
    159             'labels'       => $post_type->labels,
    160             'name'         => $post_type->label,
    161             'slug'         => $post_type->name,
    162             'supports'     => $supports,
    163             'taxonomies'   => array_values( $taxonomies ),
    164             'rest_base'    => $base,
    165         );
     154        $fields = $this->get_fields_for_response( $request );
     155        $data   = array();
     156
     157        if ( in_array( 'capabilities', $fields, true ) ) {
     158            $data['capabilities'] = $post_type->cap;
     159        }
     160
     161        if ( in_array( 'description', $fields, true ) ) {
     162            $data['description'] = $post_type->description;
     163        }
     164
     165        if ( in_array( 'hierarchical', $fields, true ) ) {
     166            $data['hierarchical'] = $post_type->hierarchical;
     167        }
     168
     169        if ( in_array( 'viewable', $fields, true ) ) {
     170            $data['viewable'] = is_post_type_viewable( $post_type );
     171        }
     172
     173        if ( in_array( 'labels', $fields, true ) ) {
     174            $data['labels'] = $post_type->labels;
     175        }
     176
     177        if ( in_array( 'name', $fields, true ) ) {
     178            $data['name'] = $post_type->label;
     179        }
     180
     181        if ( in_array( 'slug', $fields, true ) ) {
     182            $data['slug'] = $post_type->name;
     183        }
     184
     185        if ( in_array( 'supports', $fields, true ) ) {
     186            $data['supports'] = $supports;
     187        }
     188
     189        if ( in_array( 'taxonomies', $fields, true ) ) {
     190            $data['taxonomies'] = array_values( $taxonomies );
     191        }
     192
     193        if ( in_array( 'rest_base', $fields, true ) ) {
     194            $data['rest_base'] = $base;
     195        }
     196
    166197        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
    167198        $data    = $this->add_additional_fields_to_object( $data, $request );
  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    r43442 r43445  
    14011401        setup_postdata( $post );
    14021402
    1403         $schema = $this->get_item_schema();
     1403        $fields = $this->get_fields_for_response( $request );
    14041404
    14051405        // Base fields for every post.
    14061406        $data = array();
    14071407
    1408         if ( ! empty( $schema['properties']['id'] ) ) {
     1408        if ( in_array( 'id', $fields, true ) ) {
    14091409            $data['id'] = $post->ID;
    14101410        }
    14111411
    1412         if ( ! empty( $schema['properties']['date'] ) ) {
     1412        if ( in_array( 'date', $fields, true ) ) {
    14131413            $data['date'] = $this->prepare_date_response( $post->post_date_gmt, $post->post_date );
    14141414        }
    14151415
    1416         if ( ! empty( $schema['properties']['date_gmt'] ) ) {
     1416        if ( in_array( 'date_gmt', $fields, true ) ) {
    14171417            // For drafts, `post_date_gmt` may not be set, indicating that the
    14181418            // date of the draft should be updated each time it is saved (see
     
    14271427        }
    14281428
    1429         if ( ! empty( $schema['properties']['guid'] ) ) {
     1429        if ( in_array( 'guid', $fields, true ) ) {
    14301430            $data['guid'] = array(
    14311431                /** This filter is documented in wp-includes/post-template.php */
     
    14351435        }
    14361436
    1437         if ( ! empty( $schema['properties']['modified'] ) ) {
     1437        if ( in_array( 'modified', $fields, true ) ) {
    14381438            $data['modified'] = $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified );
    14391439        }
    14401440
    1441         if ( ! empty( $schema['properties']['modified_gmt'] ) ) {
     1441        if ( in_array( 'modified_gmt', $fields, true ) ) {
    14421442            // For drafts, `post_modified_gmt` may not be set (see
    14431443            // `post_date_gmt` comments above).  In this case, shim the value
     
    14521452        }
    14531453
    1454         if ( ! empty( $schema['properties']['password'] ) ) {
     1454        if ( in_array( 'password', $fields, true ) ) {
    14551455            $data['password'] = $post->post_password;
    14561456        }
    14571457
    1458         if ( ! empty( $schema['properties']['slug'] ) ) {
     1458        if ( in_array( 'slug', $fields, true ) ) {
    14591459            $data['slug'] = $post->post_name;
    14601460        }
    14611461
    1462         if ( ! empty( $schema['properties']['status'] ) ) {
     1462        if ( in_array( 'status', $fields, true ) ) {
    14631463            $data['status'] = $post->post_status;
    14641464        }
    14651465
    1466         if ( ! empty( $schema['properties']['type'] ) ) {
     1466        if ( in_array( 'type', $fields, true ) ) {
    14671467            $data['type'] = $post->post_type;
    14681468        }
    14691469
    1470         if ( ! empty( $schema['properties']['link'] ) ) {
     1470        if ( in_array( 'link', $fields, true ) ) {
    14711471            $data['link'] = get_permalink( $post->ID );
    14721472        }
    14731473
    1474         if ( ! empty( $schema['properties']['title'] ) ) {
     1474        if ( in_array( 'title', $fields, true ) ) {
    14751475            add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
    14761476
     
    14921492        }
    14931493
    1494         if ( ! empty( $schema['properties']['content'] ) ) {
     1494        if ( in_array( 'content', $fields, true ) ) {
    14951495            $data['content'] = array(
    14961496                'raw'       => $post->post_content,
     
    15011501        }
    15021502
    1503         if ( ! empty( $schema['properties']['excerpt'] ) ) {
     1503        if ( in_array( 'excerpt', $fields, true ) ) {
    15041504            /** This filter is documented in wp-includes/post-template.php */
    15051505            $excerpt = apply_filters( 'the_excerpt', apply_filters( 'get_the_excerpt', $post->post_excerpt, $post ) );
     
    15161516        }
    15171517
    1518         if ( ! empty( $schema['properties']['author'] ) ) {
     1518        if ( in_array( 'author', $fields, true ) ) {
    15191519            $data['author'] = (int) $post->post_author;
    15201520        }
    15211521
    1522         if ( ! empty( $schema['properties']['featured_media'] ) ) {
     1522        if ( in_array( 'featured_media', $fields, true ) ) {
    15231523            $data['featured_media'] = (int) get_post_thumbnail_id( $post->ID );
    15241524        }
    15251525
    1526         if ( ! empty( $schema['properties']['parent'] ) ) {
     1526        if ( in_array( 'parent', $fields, true ) ) {
    15271527            $data['parent'] = (int) $post->post_parent;
    15281528        }
    15291529
    1530         if ( ! empty( $schema['properties']['menu_order'] ) ) {
     1530        if ( in_array( 'menu_order', $fields, true ) ) {
    15311531            $data['menu_order'] = (int) $post->menu_order;
    15321532        }
    15331533
    1534         if ( ! empty( $schema['properties']['comment_status'] ) ) {
     1534        if ( in_array( 'comment_status', $fields, true ) ) {
    15351535            $data['comment_status'] = $post->comment_status;
    15361536        }
    15371537
    1538         if ( ! empty( $schema['properties']['ping_status'] ) ) {
     1538        if ( in_array( 'ping_status', $fields, true ) ) {
    15391539            $data['ping_status'] = $post->ping_status;
    15401540        }
    15411541
    1542         if ( ! empty( $schema['properties']['sticky'] ) ) {
     1542        if ( in_array( 'sticky', $fields, true ) ) {
    15431543            $data['sticky'] = is_sticky( $post->ID );
    15441544        }
    15451545
    1546         if ( ! empty( $schema['properties']['template'] ) ) {
     1546        if ( in_array( 'template', $fields, true ) ) {
    15471547            if ( $template = get_page_template_slug( $post->ID ) ) {
    15481548                $data['template'] = $template;
     
    15521552        }
    15531553
    1554         if ( ! empty( $schema['properties']['format'] ) ) {
     1554        if ( in_array( 'format', $fields, true ) ) {
    15551555            $data['format'] = get_post_format( $post->ID );
    15561556
     
    15611561        }
    15621562
    1563         if ( ! empty( $schema['properties']['meta'] ) ) {
     1563        if ( in_array( 'meta', $fields, true ) ) {
    15641564            $data['meta'] = $this->meta->get_value( $post->ID, $request );
    15651565        }
     
    15701570            $base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
    15711571
    1572             if ( ! empty( $schema['properties'][ $base ] ) ) {
     1572            if ( in_array( $base, $fields, true ) ) {
    15731573                $terms = get_the_terms( $post, $taxonomy->name );
    15741574                $data[ $base ] = $terms ? array_values( wp_list_pluck( $terms, 'term_id' ) ) : array();
  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php

    r41731 r43445  
    332332        setup_postdata( $post );
    333333
    334         $schema = $this->get_item_schema();
    335 
    336         $data = array();
    337 
    338         if ( ! empty( $schema['properties']['author'] ) ) {
     334        $fields = $this->get_fields_for_response( $request );
     335        $data   = array();
     336
     337        if ( in_array( 'author', $fields, true ) ) {
    339338            $data['author'] = (int) $post->post_author;
    340339        }
    341340
    342         if ( ! empty( $schema['properties']['date'] ) ) {
     341        if ( in_array( 'date', $fields, true ) ) {
    343342            $data['date'] = $this->prepare_date_response( $post->post_date_gmt, $post->post_date );
    344343        }
    345344
    346         if ( ! empty( $schema['properties']['date_gmt'] ) ) {
     345        if ( in_array( 'date_gmt', $fields, true ) ) {
    347346            $data['date_gmt'] = $this->prepare_date_response( $post->post_date_gmt );
    348347        }
    349348
    350         if ( ! empty( $schema['properties']['id'] ) ) {
     349        if ( in_array( 'id', $fields, true ) ) {
    351350            $data['id'] = $post->ID;
    352351        }
    353352
    354         if ( ! empty( $schema['properties']['modified'] ) ) {
     353        if ( in_array( 'modified', $fields, true ) ) {
    355354            $data['modified'] = $this->prepare_date_response( $post->post_modified_gmt, $post->post_modified );
    356355        }
    357356
    358         if ( ! empty( $schema['properties']['modified_gmt'] ) ) {
     357        if ( in_array( 'modified_gmt', $fields, true ) ) {
    359358            $data['modified_gmt'] = $this->prepare_date_response( $post->post_modified_gmt );
    360359        }
    361360
    362         if ( ! empty( $schema['properties']['parent'] ) ) {
     361        if ( in_array( 'parent', $fields, true ) ) {
    363362            $data['parent'] = (int) $post->post_parent;
    364363        }
    365364
    366         if ( ! empty( $schema['properties']['slug'] ) ) {
     365        if ( in_array( 'slug', $fields, true ) ) {
    367366            $data['slug'] = $post->post_name;
    368367        }
    369368
    370         if ( ! empty( $schema['properties']['guid'] ) ) {
     369        if ( in_array( 'guid', $fields, true ) ) {
    371370            $data['guid'] = array(
    372371                /** This filter is documented in wp-includes/post-template.php */
     
    376375        }
    377376
    378         if ( ! empty( $schema['properties']['title'] ) ) {
     377        if ( in_array( 'title', $fields, true ) ) {
    379378            $data['title'] = array(
    380379                'raw'      => $post->post_title,
     
    383382        }
    384383
    385         if ( ! empty( $schema['properties']['content'] ) ) {
     384        if ( in_array( 'content', $fields, true ) ) {
    386385
    387386            $data['content'] = array(
     
    392391        }
    393392
    394         if ( ! empty( $schema['properties']['excerpt'] ) ) {
     393        if ( in_array( 'excerpt', $fields, true ) ) {
    395394            $data['excerpt'] = array(
    396395                'raw'      => $post->post_excerpt,
  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php

    r43443 r43445  
    178178    public function prepare_item_for_response( $taxonomy, $request ) {
    179179        $base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
    180         $data = array(
    181             'name'         => $taxonomy->label,
    182             'slug'         => $taxonomy->name,
    183             'capabilities' => $taxonomy->cap,
    184             'description'  => $taxonomy->description,
    185             'labels'       => $taxonomy->labels,
    186             'types'        => $taxonomy->object_type,
    187             'show_cloud'   => $taxonomy->show_tagcloud,
    188             'hierarchical' => $taxonomy->hierarchical,
    189             'rest_base'    => $base,
    190         );
     180
     181        $fields = $this->get_fields_for_response( $request );
     182        $data   = array();
     183
     184        if ( in_array( 'name', $fields, true ) ) {
     185            $data['name'] = $taxonomy->label;
     186        }
     187
     188        if ( in_array( 'slug', $fields, true ) ) {
     189            $data['slug'] = $taxonomy->name;
     190        }
     191
     192        if ( in_array( 'capabilities', $fields, true ) ) {
     193            $data['capabilities'] = $taxonomy->cap;
     194        }
     195
     196        if ( in_array( 'description', $fields, true ) ) {
     197            $data['description'] = $taxonomy->description;
     198        }
     199
     200        if ( in_array( 'labels', $fields, true ) ) {
     201            $data['labels'] = $taxonomy->labels;
     202        }
     203
     204        if ( in_array( 'types', $fields, true ) ) {
     205            $data['types'] = $taxonomy->object_type;
     206        }
     207
     208        if ( in_array( 'show_cloud', $fields, true ) ) {
     209            $data['show_cloud'] = $taxonomy->show_tagcloud;
     210        }
     211
     212        if ( in_array( 'hierarchical', $fields, true ) ) {
     213            $data['hierarchical'] = $taxonomy->hierarchical;
     214        }
     215
     216        if ( in_array( 'rest_base', $fields, true ) ) {
     217            $data['rest_base'] = $base;
     218        }
     219
     220        if ( in_array( 'visibility', $fields, true ) ) {
     221            $data['visibility'] = array(
     222                'public'             => (bool) $taxonomy->public,
     223                'publicly_queryable' => (bool) $taxonomy->publicly_queryable,
     224                'show_admin_column'  => (bool) $taxonomy->show_admin_column,
     225                'show_in_nav_menus'  => (bool) $taxonomy->show_in_nav_menus,
     226                'show_in_quick_edit' => (bool) $taxonomy->show_in_quick_edit,
     227                'show_ui'            => (bool) $taxonomy->show_ui,
     228            );
     229        }
    191230
    192231        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php

    r43443 r43445  
    686686    public function prepare_item_for_response( $item, $request ) {
    687687
    688         $schema = $this->get_item_schema();
     688        $fields = $this->get_fields_for_response( $request );
    689689        $data   = array();
    690690
    691         if ( ! empty( $schema['properties']['id'] ) ) {
     691        if ( in_array( 'id', $fields, true ) ) {
    692692            $data['id'] = (int) $item->term_id;
    693693        }
    694694
    695         if ( ! empty( $schema['properties']['count'] ) ) {
     695        if ( in_array( 'count', $fields, true ) ) {
    696696            $data['count'] = (int) $item->count;
    697697        }
    698698
    699         if ( ! empty( $schema['properties']['description'] ) ) {
     699        if ( in_array( 'description', $fields, true ) ) {
    700700            $data['description'] = $item->description;
    701701        }
    702702
    703         if ( ! empty( $schema['properties']['link'] ) ) {
     703        if ( in_array( 'link', $fields, true ) ) {
    704704            $data['link'] = get_term_link( $item );
    705705        }
    706706
    707         if ( ! empty( $schema['properties']['name'] ) ) {
     707        if ( in_array( 'name', $fields, true ) ) {
    708708            $data['name'] = $item->name;
    709709        }
    710710
    711         if ( ! empty( $schema['properties']['slug'] ) ) {
     711        if ( in_array( 'slug', $fields, true ) ) {
    712712            $data['slug'] = $item->slug;
    713713        }
    714714
    715         if ( ! empty( $schema['properties']['taxonomy'] ) ) {
     715        if ( in_array( 'taxonomy', $fields, true ) ) {
    716716            $data['taxonomy'] = $item->taxonomy;
    717717        }
    718718
    719         if ( ! empty( $schema['properties']['parent'] ) ) {
     719        if ( in_array( 'parent', $fields, true ) ) {
    720720            $data['parent'] = (int) $item->parent;
    721721        }
    722722
    723         if ( ! empty( $schema['properties']['meta'] ) ) {
     723        if ( in_array( 'meta', $fields, true ) ) {
    724724            $data['meta'] = $this->meta->get_value( $item->term_id, $request );
    725725        }
  • branches/4.9/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php

    r43138 r43445  
    838838
    839839        $data   = array();
    840         $schema = $this->get_item_schema();
    841 
    842         if ( ! empty( $schema['properties']['id'] ) ) {
     840        $fields = $this->get_fields_for_response( $request );
     841
     842        if ( in_array( 'id', $fields, true ) ) {
    843843            $data['id'] = $user->ID;
    844844        }
    845845
    846         if ( ! empty( $schema['properties']['username'] ) ) {
     846        if ( in_array( 'username', $fields, true ) ) {
    847847            $data['username'] = $user->user_login;
    848848        }
    849849
    850         if ( ! empty( $schema['properties']['name'] ) ) {
     850        if ( in_array( 'name', $fields, true ) ) {
    851851            $data['name'] = $user->display_name;
    852852        }
    853853
    854         if ( ! empty( $schema['properties']['first_name'] ) ) {
     854        if ( in_array( 'first_name', $fields, true ) ) {
    855855            $data['first_name'] = $user->first_name;
    856856        }
    857857
    858         if ( ! empty( $schema['properties']['last_name'] ) ) {
     858        if ( in_array( 'last_name', $fields, true ) ) {
    859859            $data['last_name'] = $user->last_name;
    860860        }
    861861
    862         if ( ! empty( $schema['properties']['email'] ) ) {
     862        if ( in_array( 'email', $fields, true ) ) {
    863863            $data['email'] = $user->user_email;
    864864        }
    865865
    866         if ( ! empty( $schema['properties']['url'] ) ) {
     866        if ( in_array( 'url', $fields, true ) ) {
    867867            $data['url'] = $user->user_url;
    868868        }
    869869
    870         if ( ! empty( $schema['properties']['description'] ) ) {
     870        if ( in_array( 'description', $fields, true ) ) {
    871871            $data['description'] = $user->description;
    872872        }
    873873
    874         if ( ! empty( $schema['properties']['link'] ) ) {
     874        if ( in_array( 'link', $fields, true ) ) {
    875875            $data['link'] = get_author_posts_url( $user->ID, $user->user_nicename );
    876876        }
    877877
    878         if ( ! empty( $schema['properties']['locale'] ) ) {
     878        if ( in_array( 'locale', $fields, true ) ) {
    879879            $data['locale'] = get_user_locale( $user );
    880880        }
    881881
    882         if ( ! empty( $schema['properties']['nickname'] ) ) {
     882        if ( in_array( 'nickname', $fields, true ) ) {
    883883            $data['nickname'] = $user->nickname;
    884884        }
    885885
    886         if ( ! empty( $schema['properties']['slug'] ) ) {
     886        if ( in_array( 'slug', $fields, true ) ) {
    887887            $data['slug'] = $user->user_nicename;
    888888        }
    889889
    890         if ( ! empty( $schema['properties']['roles'] ) ) {
     890        if ( in_array( 'roles', $fields, true ) ) {
    891891            // Defensively call array_values() to ensure an array is returned.
    892892            $data['roles'] = array_values( $user->roles );
    893893        }
    894894
    895         if ( ! empty( $schema['properties']['registered_date'] ) ) {
     895        if ( in_array( 'registered_date', $fields, true ) ) {
    896896            $data['registered_date'] = date( 'c', strtotime( $user->user_registered ) );
    897897        }
    898898
    899         if ( ! empty( $schema['properties']['capabilities'] ) ) {
     899        if ( in_array( 'capabilities', $fields, true ) ) {
    900900            $data['capabilities'] = (object) $user->allcaps;
    901901        }
    902902
    903         if ( ! empty( $schema['properties']['extra_capabilities'] ) ) {
     903        if ( in_array( 'extra_capabilities', $fields, true ) ) {
    904904            $data['extra_capabilities'] = (object) $user->caps;
    905905        }
    906906
    907         if ( ! empty( $schema['properties']['avatar_urls'] ) ) {
     907        if ( in_array( 'avatar_urls', $fields, true ) ) {
    908908            $data['avatar_urls'] = rest_get_avatar_urls( $user->user_email );
    909909        }
    910910
    911         if ( ! empty( $schema['properties']['meta'] ) ) {
     911        if ( in_array( 'meta', $fields, true ) ) {
    912912            $data['meta'] = $this->meta->get_value( $user->ID, $request );
    913913        }
  • branches/4.9/tests/phpunit/tests/rest-api/rest-attachments-controller.php

    r43438 r43445  
    10751075    }
    10761076
     1077    public function test_prepare_item_limit_fields() {
     1078        $attachment_id = $this->factory->attachment->create_object(
     1079            $this->test_file, 0, array(
     1080                'post_mime_type' => 'image/jpeg',
     1081                'post_excerpt'   => 'A sample caption',
     1082                'post_author'    => self::$editor_id,
     1083            )
     1084        );
     1085        wp_set_current_user( self::$editor_id );
     1086        $endpoint = new WP_REST_Attachments_Controller( 'post' );
     1087        $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/media/%d', $attachment_id ) );
     1088        $request->set_param( 'context', 'edit' );
     1089        $request->set_param( '_fields', 'id,slug' );
     1090        $obj      = get_post( $attachment_id );
     1091        $response = $endpoint->prepare_item_for_response( $obj, $request );
     1092        $this->assertEquals( array(
     1093            'id',
     1094            'slug',
     1095        ), array_keys( $response->get_data() ) );
     1096    }
     1097
    10771098    public function test_get_item_schema() {
    10781099        $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/media' );
  • branches/4.9/tests/phpunit/tests/rest-api/rest-categories-controller.php

    r43443 r43445  
    828828    }
    829829
     830    public function test_prepare_item_limit_fields() {
     831        $request  = new WP_REST_Request;
     832        $endpoint = new WP_REST_Terms_Controller( 'category' );
     833        $request->set_param( '_fields', 'id,name' );
     834        $term     = get_term( 1, 'category' );
     835        $response = $endpoint->prepare_item_for_response( $term, $request );
     836        $this->assertEquals( array(
     837            'id',
     838            'name',
     839        ), array_keys( $response->get_data() ) );
     840    }
     841
    830842    public function test_prepare_taxonomy_term_child() {
    831843        $child = $this->factory->category->create( array(
  • branches/4.9/tests/phpunit/tests/rest-api/rest-comments-controller.php

    r40101 r43445  
    794794        $data = $response->get_data();
    795795        $this->check_comment_data( $data, 'edit', $response->get_links() );
     796    }
     797
     798    public function test_prepare_item_limit_fields() {
     799        wp_set_current_user( self::$admin_id );
     800        $endpoint = new WP_REST_Comments_Controller;
     801        $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
     802        $request->set_param( 'context', 'edit' );
     803        $request->set_param( '_fields', 'id,status' );
     804        $obj      = get_comment( self::$approved_id );
     805        $response = $endpoint->prepare_item_for_response( $obj, $request );
     806        $this->assertEquals( array(
     807            'id',
     808            'status',
     809        ), array_keys( $response->get_data() ) );
    796810    }
    797811
  • branches/4.9/tests/phpunit/tests/rest-api/rest-controller.php

    r39161 r43445  
    191191        $this->assertEquals( 'a', $args['somedefault']['default'] );
    192192    }
     193
     194    public function test_get_fields_for_response() {
     195        $controller = new WP_REST_Test_Controller();
     196        $request    = new WP_REST_Request( 'GET', '/wp/v2/testroute' );
     197        $fields     = $controller->get_fields_for_response( $request );
     198        $this->assertEquals( array(
     199            'somestring',
     200            'someinteger',
     201            'someboolean',
     202            'someurl',
     203            'somedate',
     204            'someemail',
     205            'someenum',
     206            'someargoptions',
     207            'somedefault',
     208        ), $fields );
     209        $request->set_param( '_fields', 'somestring,someinteger' );
     210        $fields = $controller->get_fields_for_response( $request );
     211        $this->assertEquals( array(
     212            'somestring',
     213            'someinteger',
     214        ), $fields );
     215    }
    193216}
  • branches/4.9/tests/phpunit/tests/rest-api/rest-pages-controller.php

    r41228 r43445  
    334334    public function test_prepare_item() {
    335335
     336    }
     337
     338    public function test_prepare_item_limit_fields() {
     339        wp_set_current_user( self::$editor_id );
     340        $page_id  = $this->factory->post->create(
     341            array(
     342                'post_status' => 'publish',
     343                'post_type'   => 'page',
     344            )
     345        );
     346        $endpoint = new WP_REST_Posts_Controller( 'page' );
     347        $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/pages/%d', $page_id ) );
     348        $request->set_param( 'context', 'edit' );
     349        $request->set_param( '_fields', 'id,slug' );
     350        $obj      = get_post( $page_id );
     351        $response = $endpoint->prepare_item_for_response( $obj, $request );
     352        $this->assertEquals( array(
     353            'id',
     354            'slug',
     355        ), array_keys( $response->get_data() ) );
    336356    }
    337357
  • branches/4.9/tests/phpunit/tests/rest-api/rest-post-statuses-controller.php

    r41176 r43445  
    128128        $data = $endpoint->prepare_item_for_response( $obj, $request );
    129129        $this->check_post_status_obj( $obj, $data->get_data(), $data->get_links() );
     130    }
     131
     132    public function test_prepare_item_limit_fields() {
     133        $obj      = get_post_status_object( 'publish' );
     134        $request  = new WP_REST_Request;
     135        $endpoint = new WP_REST_Post_Statuses_Controller;
     136        $request->set_param( 'context', 'edit' );
     137        $request->set_param( '_fields', 'id,name' );
     138        $response = $endpoint->prepare_item_for_response( $obj, $request );
     139        $this->assertEquals( array(
     140            // 'id' doesn't exist in this context.
     141            'name',
     142        ), array_keys( $response->get_data() ) );
    130143    }
    131144
  • branches/4.9/tests/phpunit/tests/rest-api/rest-post-types-controller.php

    r43038 r43445  
    122122        $response = $endpoint->prepare_item_for_response( $obj, $request );
    123123        $this->check_post_type_obj( 'edit', $obj, $response->get_data(), $response->get_links() );
     124    }
     125
     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() ) );
    124137    }
    125138
  • branches/4.9/tests/phpunit/tests/rest-api/rest-posts-controller.php

    r43442 r43445  
    12981298
    12991299        $this->check_get_post_response( $response, 'edit' );
     1300    }
     1301
     1302    public function test_prepare_item_limit_fields() {
     1303        wp_set_current_user( self::$editor_id );
     1304        $endpoint = new WP_REST_Posts_Controller( 'post' );
     1305        $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     1306        $request->set_param( 'context', 'edit' );
     1307        $request->set_param( '_fields', 'id,slug' );
     1308        $obj      = get_post( self::$post_id );
     1309        $response = $endpoint->prepare_item_for_response( $obj, $request );
     1310        $this->assertEquals( array(
     1311            'id',
     1312            'slug',
     1313        ), array_keys( $response->get_data() ) );
    13001314    }
    13011315
  • branches/4.9/tests/phpunit/tests/rest-api/rest-revisions-controller.php

    r41219 r43445  
    224224    }
    225225
     226    public function test_prepare_item_limit_fields() {
     227        wp_set_current_user( self::$editor_id );
     228        $request  = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions/' . $this->revision_id1 );
     229        $endpoint = new WP_REST_Revisions_Controller( 'post' );
     230        $request->set_param( 'context', 'edit' );
     231        $request->set_param( '_fields', 'id,slug' );
     232        $revision = get_post( $this->revision_id1 );
     233        $response = $endpoint->prepare_item_for_response( $revision, $request );
     234        $this->assertEquals( array(
     235            'id',
     236            'slug',
     237        ), array_keys( $response->get_data() ) );
     238    }
     239
    226240    public function test_get_item_schema() {
    227241        $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/posts/' . self::$post_id . '/revisions' );
  • branches/4.9/tests/phpunit/tests/rest-api/rest-tags-controller.php

    r43443 r43445  
    926926    }
    927927
     928    public function test_prepare_item_limit_fields() {
     929        $request  = new WP_REST_Request;
     930        $endpoint = new WP_REST_Terms_Controller( 'post_tag' );
     931        $request->set_param( '_fields', 'id,name' );
     932        $term     = get_term_by( 'id', $this->factory->tag->create(), 'post_tag' );
     933        $response = $endpoint->prepare_item_for_response( $term, $request );
     934        $this->assertEquals( array(
     935            'id',
     936            'name',
     937        ), array_keys( $response->get_data() ) );
     938    }
     939
    928940    public function test_get_item_schema() {
    929941        $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/tags' );
  • branches/4.9/tests/phpunit/tests/rest-api/rest-taxonomies-controller.php

    r43443 r43445  
    178178        $response = $endpoint->prepare_item_for_response( $tax, $request );
    179179        $this->check_taxonomy_object( 'edit', $tax, $response->get_data(), $response->get_links() );
     180    }
     181
     182    public function test_prepare_item_limit_fields() {
     183        $tax      = get_taxonomy( 'category' );
     184        $request  = new WP_REST_Request;
     185        $endpoint = new WP_REST_Taxonomies_Controller;
     186        $request->set_param( 'context', 'edit' );
     187        $request->set_param( '_fields', 'id,name' );
     188        $response = $endpoint->prepare_item_for_response( $tax, $request );
     189        $this->assertEquals( array(
     190            // 'id' doesn't exist in this context.
     191            'name',
     192        ), array_keys( $response->get_data() ) );
    180193    }
    181194
  • branches/4.9/tests/phpunit/tests/rest-api/rest-users-controller.php

    r43067 r43445  
    762762        $data = $this->endpoint->prepare_item_for_response( $user, $request );
    763763        $this->check_get_user_response( $data, 'edit' );
     764    }
     765
     766    public function test_prepare_item_limit_fields() {
     767        wp_set_current_user( self::$user );
     768        $request = new WP_REST_Request;
     769        $request->set_param( 'context', 'edit' );
     770        $request->set_param( '_fields', 'id,name' );
     771        $user     = get_user_by( 'id', get_current_user_id() );
     772        $response = $this->endpoint->prepare_item_for_response( $user, $request );
     773        $this->assertEquals( array(
     774            'id',
     775            'name',
     776        ), array_keys( $response->get_data() ) );
    764777    }
    765778
Note: See TracChangeset for help on using the changeset viewer.