diff --git a/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php b/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php index 78cef6f910..817f5c106a 100644 --- a/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php +++ b/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php @@ -232,6 +232,10 @@ abstract class WP_REST_Meta_Fields { ); } + if ( null === get_metadata_raw( $meta_type, $object_id, wp_slash( $meta_key ) ) ) { + return true; + } + if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $meta_key ) ) ) { return new WP_Error( 'rest_meta_database_error', diff --git a/tests/phpunit/tests/rest-api/rest-post-meta-fields.php b/tests/phpunit/tests/rest-api/rest-post-meta-fields.php index 2b24cfc667..0953a9fd41 100644 --- a/tests/phpunit/tests/rest-api/rest-post-meta-fields.php +++ b/tests/phpunit/tests/rest-api/rest-post-meta-fields.php @@ -1052,6 +1052,42 @@ class WP_Test_REST_Post_Meta_Fields extends WP_Test_REST_TestCase { $this->assertEmpty( $meta ); } + /** + * Ensure deleting non-existant meta data behaves gracefully. + * + * @ticket 52787 + * @dataProvider data_delete_does_not_trigger_error_if_no_meta_values + * + * @param array|null $delete_value Value used to delete meta data. + */ + public function test_delete_does_not_trigger_error_if_no_meta_values( $delete_value ) { + $this->grant_write_permission(); + + $data = array( + 'meta' => array( + 'test_multi' => $delete_value, + ), + ); + $request = new WP_REST_Request( 'POST', sprintf( '/wp/v2/posts/%d', self::$post_id ) ); + $request->set_body_params( $data ); + + $response = rest_get_server()->dispatch( $request ); + + $this->assertSame( 200, $response->get_status() ); + } + + /** + * Data provider for test_delete_does_not_trigger_error_if_no_meta_values(). + * + * @return array[] Array of test parameters. + */ + public function data_delete_does_not_trigger_error_if_no_meta_values() { + return array( + array( array() ), + array( null ), + ); + } + public function test_remove_multi_value_db_error() { add_post_meta( self::$post_id, 'test_multi', 'val1' ); $values = get_post_meta( self::$post_id, 'test_multi', false );