diff --git src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php
index 9d8e7d4..bcbd524 100644
|
|
class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { |
247 | 247 | protected function prepare_item_for_database( $request ) { |
248 | 248 | $prepared_attachment = parent::prepare_item_for_database( $request ); |
249 | 249 | |
| 250 | // Attachment caption (post_excerpt internally) |
250 | 251 | if ( isset( $request['caption'] ) ) { |
251 | | $prepared_attachment->post_excerpt = $request['caption']; |
| 252 | if ( is_string( $request['caption'] ) ) { |
| 253 | $prepared_attachment->post_excerpt = wp_filter_post_kses( $request['caption'] ); |
| 254 | } elseif ( isset( $request['caption']['raw'] ) ) { |
| 255 | $prepared_attachment->post_excerpt = wp_filter_post_kses( $request['caption']['raw'] ); |
| 256 | } |
252 | 257 | } |
253 | 258 | |
| 259 | // Attachment description (post_content internally) |
254 | 260 | if ( isset( $request['description'] ) ) { |
255 | | $prepared_attachment->post_content = $request['description']; |
| 261 | if ( is_string( $request['description'] ) ) { |
| 262 | $prepared_attachment->post_content = wp_filter_post_kses( $request['description'] ); |
| 263 | } elseif ( isset( $request['description']['raw'] ) ) { |
| 264 | $prepared_attachment->post_content = wp_filter_post_kses( $request['description']['raw'] ); |
| 265 | } |
256 | 266 | } |
257 | 267 | |
258 | 268 | if ( isset( $request['post'] ) ) { |
… |
… |
class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { |
276 | 286 | $response = parent::prepare_item_for_response( $post, $request ); |
277 | 287 | $data = $response->get_data(); |
278 | 288 | |
| 289 | $data['description'] = array( |
| 290 | 'raw' => $post->post_content, |
| 291 | /** 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 | |
279 | 302 | $data['alt_text'] = get_post_meta( $post->ID, '_wp_attachment_image_alt', true ); |
280 | | $data['caption'] = $post->post_excerpt; |
281 | | $data['description'] = $post->post_content; |
282 | 303 | $data['media_type'] = wp_attachment_is_image( $post->ID ) ? 'image' : 'file'; |
283 | 304 | $data['mime_type'] = $post->post_mime_type; |
284 | 305 | $data['media_details'] = wp_get_attachment_metadata( $post->ID ); |
… |
… |
class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { |
366 | 387 | ); |
367 | 388 | |
368 | 389 | $schema['properties']['caption'] = array( |
369 | | 'description' => __( 'The caption for the resource.' ), |
370 | | 'type' => 'string', |
371 | | 'context' => array( 'view', 'edit' ), |
372 | | 'arg_options' => array( |
373 | | 'sanitize_callback' => 'wp_filter_post_kses', |
| 390 | 'description' => __( 'The caption for the resource.' ), |
| 391 | 'type' => 'object', |
| 392 | 'context' => array( 'view', 'edit', 'embed' ), |
| 393 | 'arg_options' => array( |
| 394 | 'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database() |
| 395 | ), |
| 396 | 'properties' => array( |
| 397 | 'raw' => array( |
| 398 | 'description' => __( 'Caption for the resource, as it exists in the database.' ), |
| 399 | 'type' => 'string', |
| 400 | 'context' => array( 'edit' ), |
| 401 | ), |
| 402 | 'rendered' => array( |
| 403 | 'description' => __( 'HTML caption for the resource, transformed for display.' ), |
| 404 | 'type' => 'string', |
| 405 | 'context' => array( 'view', 'edit', 'embed' ), |
| 406 | 'readonly' => true, |
| 407 | ), |
374 | 408 | ), |
375 | 409 | ); |
376 | 410 | |
377 | 411 | $schema['properties']['description'] = array( |
378 | | 'description' => __( 'The description for the resource.' ), |
379 | | 'type' => 'string', |
380 | | 'context' => array( 'view', 'edit' ), |
381 | | 'arg_options' => array( |
382 | | 'sanitize_callback' => 'wp_filter_post_kses', |
| 412 | 'description' => __( 'The description for the resource.' ), |
| 413 | 'type' => 'object', |
| 414 | 'context' => array( 'view', 'edit' ), |
| 415 | 'arg_options' => array( |
| 416 | 'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database() |
| 417 | ), |
| 418 | 'properties' => array( |
| 419 | 'raw' => array( |
| 420 | 'description' => __( 'Description for the object, as it exists in the database.' ), |
| 421 | 'type' => 'string', |
| 422 | 'context' => array( 'edit' ), |
| 423 | ), |
| 424 | 'rendered' => array( |
| 425 | 'description' => __( 'HTML description for the object, transformed for display.' ), |
| 426 | 'type' => 'string', |
| 427 | 'context' => array( 'view', 'edit' ), |
| 428 | 'readonly' => true, |
| 429 | ), |
383 | 430 | ), |
384 | 431 | ); |
385 | 432 | |
diff --git tests/phpunit/tests/rest-api/rest-attachments-controller.php tests/phpunit/tests/rest-api/rest-attachments-controller.php
index 3fceb44..b84b0cc 100644
|
|
class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control |
460 | 460 | |
461 | 461 | public function test_create_item() { |
462 | 462 | wp_set_current_user( self::$author_id ); |
| 463 | |
463 | 464 | $request = new WP_REST_Request( 'POST', '/wp/v2/media' ); |
464 | 465 | $request->set_header( 'Content-Type', 'image/jpeg' ); |
465 | 466 | $request->set_header( 'Content-Disposition', 'attachment; filename=canola.jpg' ); |
| 467 | $request->set_param( 'title', 'My title is very cool' ); |
| 468 | $request->set_param( 'caption', 'This is a better caption.' ); |
| 469 | $request->set_param( 'description', 'Without a description, my attachment is descriptionless.' ); |
| 470 | $request->set_param( 'alt_text', 'Alt text is stored outside post schema.' ); |
| 471 | |
466 | 472 | $request->set_body( file_get_contents( $this->test_file ) ); |
467 | 473 | $response = $this->server->dispatch( $request ); |
468 | 474 | $data = $response->get_data(); |
| 475 | |
469 | 476 | $this->assertEquals( 201, $response->get_status() ); |
470 | 477 | $this->assertEquals( 'image', $data['media_type'] ); |
| 478 | |
| 479 | $attachment = get_post( $data['id'] ); |
| 480 | $this->assertEquals( 'My title is very cool', $data['title']['raw'] ); |
| 481 | $this->assertEquals( 'My title is very cool', $attachment->post_title ); |
| 482 | $this->assertEquals( 'This is a better caption.', $data['caption']['raw'] ); |
| 483 | $this->assertEquals( 'This is a better caption.', $attachment->post_excerpt ); |
| 484 | $this->assertEquals( 'Without a description, my attachment is descriptionless.', $data['description']['raw'] ); |
| 485 | $this->assertEquals( 'Without a description, my attachment is descriptionless.', $attachment->post_content ); |
| 486 | $this->assertEquals( 'Alt text is stored outside post schema.', $data['alt_text'] ); |
| 487 | $this->assertEquals( 'Alt text is stored outside post schema.', get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ) ); |
471 | 488 | } |
472 | 489 | |
473 | 490 | public function test_create_item_default_filename_title() { |
… |
… |
class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control |
650 | 667 | $attachment = get_post( $data['id'] ); |
651 | 668 | $this->assertEquals( 'My title is very cool', $data['title']['raw'] ); |
652 | 669 | $this->assertEquals( 'My title is very cool', $attachment->post_title ); |
653 | | $this->assertEquals( 'This is a better caption.', $data['caption'] ); |
| 670 | $this->assertEquals( 'This is a better caption.', $data['caption']['raw'] ); |
654 | 671 | $this->assertEquals( 'This is a better caption.', $attachment->post_excerpt ); |
655 | | $this->assertEquals( 'Without a description, my attachment is descriptionless.', $data['description'] ); |
| 672 | $this->assertEquals( 'Without a description, my attachment is descriptionless.', $data['description']['raw'] ); |
656 | 673 | $this->assertEquals( 'Without a description, my attachment is descriptionless.', $attachment->post_content ); |
657 | 674 | $this->assertEquals( 'Alt text is stored outside post schema.', $data['alt_text'] ); |
658 | 675 | $this->assertEquals( 'Alt text is stored outside post schema.', get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ) ); |
… |
… |
class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control |
775 | 792 | $this->assertArrayHasKey( 'author', $properties ); |
776 | 793 | $this->assertArrayHasKey( 'alt_text', $properties ); |
777 | 794 | $this->assertArrayHasKey( 'caption', $properties ); |
| 795 | $this->assertArrayHasKey( 'raw', $properties['caption']['properties'] ); |
| 796 | $this->assertArrayHasKey( 'rendered', $properties['caption']['properties'] ); |
778 | 797 | $this->assertArrayHasKey( 'description', $properties ); |
| 798 | $this->assertArrayHasKey( 'raw', $properties['description']['properties'] ); |
| 799 | $this->assertArrayHasKey( 'rendered', $properties['description']['properties'] ); |
779 | 800 | $this->assertArrayHasKey( 'comment_status', $properties ); |
780 | 801 | $this->assertArrayHasKey( 'date', $properties ); |
781 | 802 | $this->assertArrayHasKey( 'date_gmt', $properties ); |
… |
… |
class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control |
794 | 815 | $this->assertArrayHasKey( 'slug', $properties ); |
795 | 816 | $this->assertArrayHasKey( 'source_url', $properties ); |
796 | 817 | $this->assertArrayHasKey( 'title', $properties ); |
| 818 | $this->assertArrayHasKey( 'raw', $properties['title']['properties'] ); |
| 819 | $this->assertArrayHasKey( 'rendered', $properties['title']['properties'] ); |
797 | 820 | $this->assertArrayHasKey( 'type', $properties ); |
798 | 821 | } |
799 | 822 | |
… |
… |
class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control |
891 | 914 | protected function check_post_data( $attachment, $data, $context = 'view', $links ) { |
892 | 915 | parent::check_post_data( $attachment, $data, $context, $links ); |
893 | 916 | |
| 917 | $this->assertArrayNotHasKey( 'content', $data ); |
| 918 | $this->assertArrayNotHasKey( 'excerpt', $data ); |
| 919 | |
894 | 920 | $this->assertEquals( get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ), $data['alt_text'] ); |
895 | | $this->assertEquals( $attachment->post_excerpt, $data['caption'] ); |
896 | | $this->assertEquals( $attachment->post_content, $data['description'] ); |
| 921 | if ( 'edit' === $context ) { |
| 922 | $this->assertEquals( $attachment->post_excerpt, $data['caption']['raw'] ); |
| 923 | $this->assertEquals( $attachment->post_content, $data['description']['raw'] ); |
| 924 | } else { |
| 925 | $this->assertFalse( isset( $data['caption']['raw'] ) ); |
| 926 | $this->assertFalse( isset( $data['description']['raw'] ) ); |
| 927 | } |
897 | 928 | $this->assertTrue( isset( $data['media_details'] ) ); |
898 | 929 | |
899 | 930 | if ( $attachment->post_parent ) { |