On this page
WP_REST_Meta_Fields::update_multi_meta_value( int $object_id, string $meta_key, string $name, array $values ): true|WP_Error
Updates multiple meta values for an object.
Description
Alters the list of values in the database to match the list of provided values.
Parameters
$object_idint Required-
Object ID to update.
$meta_keystring Required-
Key for the custom field.
$namestring Required-
Name for the field that is exposed in the REST API.
$valuesarray Required-
List of values to update to.
Return
true|WP_Error True if meta fields are updated, WP_Error otherwise.
Source
File: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php. View all references
protected function update_multi_meta_value( $object_id, $meta_key, $name, $values ) {
$meta_type = $this->get_meta_type();
if ( ! current_user_can( "edit_{$meta_type}_meta", $object_id, $meta_key ) ) {
return new WP_Error(
'rest_cannot_update',
/* translators: %s: Custom field key. */
sprintf( __( 'Sorry, you are not allowed to edit the %s custom field.' ), $name ),
array(
'key' => $name,
'status' => rest_authorization_required_code(),
)
);
}
$current_values = get_metadata( $meta_type, $object_id, $meta_key, false );
$subtype = get_object_subtype( $meta_type, $object_id );
if ( ! is_array( $current_values ) ) {
$current_values = array();
}
$to_remove = $current_values;
$to_add = $values;
foreach ( $to_add as $add_key => $value ) {
$remove_keys = array_keys(
array_filter(
$current_values,
function ( $stored_value ) use ( $meta_key, $subtype, $value ) {
return $this->is_meta_value_same_as_stored_value( $meta_key, $subtype, $stored_value, $value );
}
)
);
if ( empty( $remove_keys ) ) {
continue;
}
if ( count( $remove_keys ) > 1 ) {
// To remove, we need to remove first, then add, so don't touch.
continue;
}
$remove_key = $remove_keys[0];
unset( $to_remove[ $remove_key ] );
unset( $to_add[ $add_key ] );
}
/*
* `delete_metadata` removes _all_ instances of the value, so only call once. Otherwise,
* `delete_metadata` will return false for subsequent calls of the same value.
* Use serialization to produce a predictable string that can be used by array_unique.
*/
$to_remove = array_map( 'maybe_unserialize', array_unique( array_map( 'maybe_serialize', $to_remove ) ) );
foreach ( $to_remove as $value ) {
if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $meta_key ), wp_slash( $value ) ) ) {
return new WP_Error(
'rest_meta_database_error',
/* translators: %s: Custom field key. */
sprintf( __( 'Could not update the meta value of %s in database.' ), $meta_key ),
array(
'key' => $name,
'status' => WP_Http::INTERNAL_SERVER_ERROR,
)
);
}
}
foreach ( $to_add as $value ) {
if ( ! add_metadata( $meta_type, $object_id, wp_slash( $meta_key ), wp_slash( $value ) ) ) {
return new WP_Error(
'rest_meta_database_error',
/* translators: %s: Custom field key. */
sprintf( __( 'Could not update the meta value of %s in database.' ), $meta_key ),
array(
'key' => $name,
'status' => WP_Http::INTERNAL_SERVER_ERROR,
)
);
}
}
return true;
}
Related
Uses
| Uses | Description |
|---|---|
| WP_REST_Meta_Fields::is_meta_value_same_as_stored_value() wp-includes/rest-api/fields/class-wp-rest-meta-fields.php | Checks if the user provided value is equivalent to a stored value for the given meta key. |
| get_object_subtype() wp-includes/meta.php | Returns the object subtype for a given object ID of a specific type. |
| WP_REST_Meta_Fields::get_meta_type() wp-includes/rest-api/fields/class-wp-rest-meta-fields.php | Retrieves the object meta type. |
| get_metadata() wp-includes/meta.php | Retrieves the value of a metadata field for the specified object type and ID. |
| delete_metadata() wp-includes/meta.php | Deletes metadata for the specified object. |
| add_metadata() wp-includes/meta.php | Adds metadata for the specified object. |
| rest_authorization_required_code() wp-includes/rest-api.php | Returns a contextual HTTP error code for authorization failure. |
| current_user_can() wp-includes/capabilities.php | Returns whether the current user has the specified capability. |
| __() wp-includes/l10n.php | Retrieves the translation of $text. |
| wp_slash() wp-includes/formatting.php | Adds slashes to a string or recursively adds slashes to strings within an array. |
| WP_Error::__construct() wp-includes/class-wp-error.php | Initializes the error. |
Used By
| Used By | Description |
|---|---|
| WP_REST_Meta_Fields::update_value() wp-includes/rest-api/fields/class-wp-rest-meta-fields.php | Updates meta values. |
Changelog
| Version | Description |
|---|---|
| 4.7.0 | Introduced. |
© 2003–2022 WordPress Foundation
Licensed under the GNU GPLv2+ License.
https://developer.wordpress.org/reference/classes/wp_rest_meta_fields/update_multi_meta_value