Skip to content

Commit 7e66aef

Browse files
committed
REST API: Prevent database error when deleting meta data.
Add a check to `WP_REST_Meta_Fields::delete_meta_value()` ensuring meta data is set before attempting to delete it from the database. If the data does not exist, the delete is considered successful as the data matches the desired state. Props BrechtVds, goaroundagain, TimothyBlynJacobs. Merges [50567] to the 5.7 branch. Fixes #52787. git-svn-id: https://develop.svn.wordpress.org/branches/5.7@50573 602fd350-edb4-49c9-b593-d223f7449a82
1 parent ba6f278 commit 7e66aef

2 files changed

Lines changed: 40 additions & 0 deletions

File tree

src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,10 @@ protected function delete_meta_value( $object_id, $meta_key, $name ) {
232232
);
233233
}
234234

235+
if ( null === get_metadata_raw( $meta_type, $object_id, wp_slash( $meta_key ) ) ) {
236+
return true;
237+
}
238+
235239
if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $meta_key ) ) ) {
236240
return new WP_Error(
237241
'rest_meta_database_error',

tests/phpunit/tests/rest-api/rest-post-meta-fields.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,42 @@ public function test_remove_multi_value_with_empty_array() {
10521052
$this->assertEmpty( $meta );
10531053
}
10541054

1055+
/**
1056+
* Ensure deleting non-existant meta data behaves gracefully.
1057+
*
1058+
* @ticket 52787
1059+
* @dataProvider data_delete_does_not_trigger_error_if_no_meta_values
1060+
*
1061+
* @param array|null $delete_value Value used to delete meta data.
1062+
*/
1063+
public function test_delete_does_not_trigger_error_if_no_meta_values( $delete_value ) {
1064+
$this->grant_write_permission();
1065+
1066+
$data = array(
1067+
'meta' => array(
1068+
'test_multi' => $delete_value,
1069+
),
1070+
);
1071+
$request = new WP_REST_Request( 'POST', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
1072+
$request->set_body_params( $data );
1073+
1074+
$response = rest_get_server()->dispatch( $request );
1075+
1076+
$this->assertSame( 200, $response->get_status() );
1077+
}
1078+
1079+
/**
1080+
* Data provider for test_delete_does_not_trigger_error_if_no_meta_values().
1081+
*
1082+
* @return array[] Array of test parameters.
1083+
*/
1084+
public function data_delete_does_not_trigger_error_if_no_meta_values() {
1085+
return array(
1086+
array( array() ),
1087+
array( null ),
1088+
);
1089+
}
1090+
10551091
public function test_remove_multi_value_db_error() {
10561092
add_post_meta( self::$post_id, 'test_multi', 'val1' );
10571093
$values = get_post_meta( self::$post_id, 'test_multi', false );

0 commit comments

Comments
 (0)