Ticket #38786: 38786.2.diff
File 38786.2.diff, 11.3 KB (added by , 7 years ago) |
---|
-
src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php
65 65 $fields = $this->get_registered_fields(); 66 66 $response = array(); 67 67 68 foreach ( $fields as $name => $args ) { 69 $all_values = get_metadata( $this->get_meta_type(), $object_id, $name, false ); 68 foreach ( $fields as $meta_key => $args ) { 69 $name = $args['name']; 70 $all_values = get_metadata( $this->get_meta_type(), $object_id, $meta_key, false ); 70 71 if ( $args['single'] ) { 71 72 if ( empty( $all_values ) ) { 72 73 $value = $args['schema']['default']; … … 122 123 */ 123 124 public function update_value( $request, $object_id ) { 124 125 $fields = $this->get_registered_fields(); 125 foreach ( $fields as $name => $args ) { 126 foreach ( $fields as $meta_key => $args ) { 127 $name = $args['name']; 126 128 if ( ! array_key_exists( $name, $request ) ) { 127 129 continue; 128 130 } … … 132 134 * from the database and then relying on the default value. 133 135 */ 134 136 if ( is_null( $request[ $name ] ) ) { 135 $result = $this->delete_meta_value( $object_id, $ name );137 $result = $this->delete_meta_value( $object_id, $meta_key, $name ); 136 138 if ( is_wp_error( $result ) ) { 137 139 return $result; 138 140 } … … 148 150 $value = rest_sanitize_value_from_schema( $request[ $name ], $args['schema'] ); 149 151 150 152 if ( $args['single'] ) { 151 $result = $this->update_meta_value( $object_id, $ name, $value );153 $result = $this->update_meta_value( $object_id, $meta_key, $name, $value ); 152 154 } else { 153 $result = $this->update_multi_meta_value( $object_id, $ name, $value );155 $result = $this->update_multi_meta_value( $object_id, $meta_key, $name, $value ); 154 156 } 155 157 156 158 if ( is_wp_error( $result ) ) { … … 168 170 * @access protected 169 171 * 170 172 * @param int $object_id Object ID the field belongs to. 171 * @param string $name Key for the field. 173 * @param string $meta_key Key for the field. 174 * @param string $name Name for the field that is exposed in the REST API. 172 175 * @return bool|WP_Error True if meta field is deleted, WP_Error otherwise. 173 176 */ 174 protected function delete_meta_value( $object_id, $ name ) {177 protected function delete_meta_value( $object_id, $meta_key, $name ) { 175 178 $meta_type = $this->get_meta_type(); 176 if ( ! current_user_can( "delete_{$meta_type}_meta", $object_id, $ name) ) {179 if ( ! current_user_can( "delete_{$meta_type}_meta", $object_id, $meta_key ) ) { 177 180 return new WP_Error( 178 181 'rest_cannot_delete', 179 182 /* translators: %s: custom field key */ … … 182 185 ); 183 186 } 184 187 185 if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $ name) ) ) {188 if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $meta_key ) ) ) { 186 189 return new WP_Error( 187 190 'rest_meta_database_error', 188 191 __( 'Could not delete meta value from database.' ), … … 202 205 * @access protected 203 206 * 204 207 * @param int $object_id Object ID to update. 205 * @param string $name Key for the custom field. 208 * @param string $meta_key Key for the custom field. 209 * @param string $name Name for the field that is exposed in the REST API. 206 210 * @param array $values List of values to update to. 207 211 * @return bool|WP_Error True if meta fields are updated, WP_Error otherwise. 208 212 */ 209 protected function update_multi_meta_value( $object_id, $ name, $values ) {213 protected function update_multi_meta_value( $object_id, $meta_key, $name, $values ) { 210 214 $meta_type = $this->get_meta_type(); 211 if ( ! current_user_can( "edit_{$meta_type}_meta", $object_id, $ name) ) {215 if ( ! current_user_can( "edit_{$meta_type}_meta", $object_id, $meta_key ) ) { 212 216 return new WP_Error( 213 217 'rest_cannot_update', 214 218 /* translators: %s: custom field key */ … … 217 221 ); 218 222 } 219 223 220 $current = get_metadata( $meta_type, $object_id, $ name, false );224 $current = get_metadata( $meta_type, $object_id, $meta_key, false ); 221 225 222 226 $to_remove = $current; 223 227 $to_add = $values; … … 244 248 $to_remove = array_unique( $to_remove ); 245 249 246 250 foreach ( $to_remove as $value ) { 247 if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $ name), wp_slash( $value ) ) ) {251 if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $meta_key ), wp_slash( $value ) ) ) { 248 252 return new WP_Error( 249 253 'rest_meta_database_error', 250 254 __( 'Could not update meta value in database.' ), … … 254 258 } 255 259 256 260 foreach ( $to_add as $value ) { 257 if ( ! add_metadata( $meta_type, $object_id, wp_slash( $ name), wp_slash( $value ) ) ) {261 if ( ! add_metadata( $meta_type, $object_id, wp_slash( $meta_key ), wp_slash( $value ) ) ) { 258 262 return new WP_Error( 259 263 'rest_meta_database_error', 260 264 __( 'Could not update meta value in database.' ), … … 273 277 * @access protected 274 278 * 275 279 * @param int $object_id Object ID to update. 276 * @param string $name Key for the custom field. 280 * @param string $meta_key Key for the custom field. 281 * @param string $name Name for the field that is exposed in the REST API. 277 282 * @param mixed $value Updated value. 278 283 * @return bool|WP_Error True if the meta field was updated, WP_Error otherwise. 279 284 */ 280 protected function update_meta_value( $object_id, $ name, $value ) {285 protected function update_meta_value( $object_id, $meta_key, $name, $value ) { 281 286 $meta_type = $this->get_meta_type(); 282 if ( ! current_user_can( "edit_{$meta_type}_meta", $object_id, $ name) ) {287 if ( ! current_user_can( "edit_{$meta_type}_meta", $object_id, $meta_key ) ) { 283 288 return new WP_Error( 284 289 'rest_cannot_update', 285 290 /* translators: %s: custom field key */ … … 288 293 ); 289 294 } 290 295 291 $meta_key = wp_slash( $ name);296 $meta_key = wp_slash( $meta_key ); 292 297 $meta_value = wp_slash( $value ); 293 298 294 299 // Do the exact same check for a duplicate value as in update_metadata() to avoid update_metadata() returning false. … … 364 369 $rest_args['schema']['type'] = 'array'; 365 370 } 366 371 367 $registered[ $ rest_args['name']] = $rest_args;372 $registered[ $name ] = $rest_args; 368 373 } 369 374 370 375 return $registered; … … 388 393 'properties' => array(), 389 394 ); 390 395 391 foreach ( $fields as $ key => $args ) {392 $schema['properties'][ $ key] = $args['schema'];396 foreach ( $fields as $args ) { 397 $schema['properties'][ $args['name'] ] = $args['schema']; 393 398 } 394 399 395 400 return $schema; -
tests/phpunit/tests/rest-api/rest-post-meta-fields.php
79 79 'show_in_rest' => true, 80 80 )); 81 81 82 register_meta( 'post', 'test_custom_name', array( 83 'single' => true, 84 'type' => 'string', 85 'show_in_rest' => array( 86 'name' => 'new_name', 87 ), 88 )); 89 90 register_meta( 'post', 'test_custom_name_multi', array( 91 'single' => false, 92 'type' => 'string', 93 'show_in_rest' => array( 94 'name' => 'new_name_multi', 95 ), 96 )); 97 82 98 /** @var WP_REST_Server $wp_rest_server */ 83 99 global $wp_rest_server; 84 100 $this->server = $wp_rest_server = new Spy_REST_Server; … … 227 243 $this->assertSame( true, $meta['test_bool'] ); 228 244 } 229 245 246 public function test_get_value_custom_name() { 247 add_post_meta( self::$post_id, 'test_custom_name', 'janet' ); 248 249 $request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/posts/%d', self::$post_id ) ); 250 $response = $this->server->dispatch( $request ); 251 252 $this->assertEquals( 200, $response->get_status() ); 253 254 $data = $response->get_data(); 255 $this->assertArrayHasKey( 'meta', $data ); 256 257 $meta = (array) $data['meta']; 258 $this->assertArrayHasKey( 'new_name', $meta ); 259 $this->assertEquals( 'janet', $meta['new_name'] ); 260 } 261 230 262 /** 231 263 * @depends test_get_value 232 264 */ … … 681 713 $this->assertContains( 8, $meta ); 682 714 } 683 715 716 /** 717 * @depends test_get_value_custom_name 718 */ 719 public function test_set_value_custom_name() { 720 // Ensure no data exists currently. 721 $values = get_post_meta( self::$post_id, 'test_custom_name', false ); 722 $this->assertEmpty( $values ); 723 724 $this->grant_write_permission(); 725 726 $data = array( 727 'meta' => array( 728 'new_name' => 'janet', 729 ), 730 ); 731 $request = new WP_REST_Request( 'POST', sprintf( '/wp/v2/posts/%d', self::$post_id ) ); 732 $request->set_body_params( $data ); 733 734 $response = $this->server->dispatch( $request ); 735 $this->assertEquals( 200, $response->get_status() ); 736 737 $meta = get_post_meta( self::$post_id, 'test_custom_name', false ); 738 $this->assertNotEmpty( $meta ); 739 $this->assertCount( 1, $meta ); 740 $this->assertEquals( 'janet', $meta[0] ); 741 742 $data = $response->get_data(); 743 $meta = (array) $data['meta']; 744 $this->assertArrayHasKey( 'new_name', $meta ); 745 $this->assertEquals( 'janet', $meta['new_name'] ); 746 } 747 748 public function test_set_value_custom_name_multiple() { 749 // Ensure no data exists currently. 750 $values = get_post_meta( self::$post_id, 'test_custom_name_multi', false ); 751 $this->assertEmpty( $values ); 752 753 $this->grant_write_permission(); 754 755 $data = array( 756 'meta' => array( 757 'new_name_multi' => array( 'janet' ), 758 ), 759 ); 760 $request = new WP_REST_Request( 'POST', sprintf( '/wp/v2/posts/%d', self::$post_id ) ); 761 $request->set_body_params( $data ); 762 763 $response = $this->server->dispatch( $request ); 764 $this->assertEquals( 200, $response->get_status() ); 765 766 $meta = get_post_meta( self::$post_id, 'test_custom_name_multi', false ); 767 $this->assertNotEmpty( $meta ); 768 $this->assertCount( 1, $meta ); 769 $this->assertEquals( 'janet', $meta[0] ); 770 771 // Add another value. 772 $data = array( 773 'meta' => array( 774 'new_name_multi' => array( 'janet', 'graeme' ), 775 ), 776 ); 777 $request->set_body_params( $data ); 778 779 $response = $this->server->dispatch( $request ); 780 $this->assertEquals( 200, $response->get_status() ); 781 782 $meta = get_post_meta( self::$post_id, 'test_custom_name_multi', false ); 783 $this->assertNotEmpty( $meta ); 784 $this->assertCount( 2, $meta ); 785 $this->assertContains( 'janet', $meta ); 786 $this->assertContains( 'graeme', $meta ); 787 } 788 684 789 public function test_remove_multi_value_db_error() { 685 790 add_post_meta( self::$post_id, 'test_multi', 'val1' ); 686 791 $values = get_post_meta( self::$post_id, 'test_multi', false ); … … 791 896 $this->assertErrorResponse( 'rest_meta_database_error', $response, 500 ); 792 897 } 793 898 899 public function test_delete_value_custom_name() { 900 add_post_meta( self::$post_id, 'test_custom_name', 'janet' ); 901 $current = get_post_meta( self::$post_id, 'test_custom_name', true ); 902 $this->assertEquals( 'janet', $current ); 903 904 $this->grant_write_permission(); 905 906 $data = array( 907 'meta' => array( 908 'new_name' => null, 909 ), 910 ); 911 $request = new WP_REST_Request( 'POST', sprintf( '/wp/v2/posts/%d', self::$post_id ) ); 912 $request->set_body_params( $data ); 913 914 $response = $this->server->dispatch( $request ); 915 $this->assertEquals( 200, $response->get_status() ); 916 917 $meta = get_post_meta( self::$post_id, 'test_custom_name', false ); 918 $this->assertEmpty( $meta ); 919 } 920 794 921 public function test_get_schema() { 795 922 $request = new WP_REST_Request( 'OPTIONS', sprintf( '/wp/v2/posts/%d', self::$post_id ) ); 796 923 $response = $this->server->dispatch( $request );