Updates a post meta field based on the given post ID.
Description
Use the $prev_value
parameter to differentiate between meta fields with the same key and post ID.
If the meta field for the post does not exist, it will be added and its ID returned.
Can be used in place of add_post_meta() .
Parameters
$post_id
intrequired- Post ID.
$meta_key
stringrequired- Metadata key.
$meta_value
mixedrequired- Metadata value. Must be serializable if non-scalar.
$prev_value
mixedoptional- Previous value to check before updating.
If specified, only update existing metadata entries with this value. Otherwise, update all entries.Default:
''
Return
int|bool Meta ID if the key didn’t exist, true on successful update, false on failure or if the value passed to the function is the same as the one that is already in the database.More Information
Character Escaping
Post meta values are passed through the stripslashes() function upon being stored, so you will need to be careful when passing in values (such as JSON) that might include \ escaped characters.
Do not store escaped values
Consider the JSON value {"key":"value with \"escaped quotes\""}
<?php $escaped_json = '{"key":"value with \\"escaped quotes\\""}'; update_post_meta( $id, 'escaped_json', $escaped_json ); $broken = get_post_meta( $id, 'escaped_json', true ); /* $broken, after passing through stripslashes() ends up unparsable: {"key":"value with "escaped quotes""} */ ?>
Workaround
By adding one more level of \ escaping using function wp_slash
(introduced in WP 3.6), you can compensate for the call to stripslashes()
<?php $escaped_json = '{"key":"value with \\"escaped quotes\\""}'; update_post_meta( $id, 'double_escaped_json', wp_slash( $escaped_json ) ); $fixed = get_post_meta( $id, 'double_escaped_json', true ); /* $fixed, after stripslashes(), ends up being stored as desired: {"key":"value with \"escaped quotes\""} */ ?>
Source
function update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' ) { // Make sure meta is updated for the post, not for a revision. $the_post = wp_is_post_revision( $post_id ); if ( $the_post ) { $post_id = $the_post; } return update_metadata( 'post', $post_id, $meta_key, $meta_value, $prev_value ); }
Related
Uses | Description |
---|---|
wp_is_post_revision()wp-includes/revision.php | Determines if the specified post is a revision. |
update_metadata()wp-includes/meta.php | Updates metadata for the specified object. If no value already exists for the specified object ID and metadata key, the metadata will be added. |
Used by | Description |
---|---|
WP_REST_Attachments_Controller::edit_media_item()wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php | Applies edits to a media item and creates a new attachment record. |
_wp_privacy_account_request_confirmed()wp-includes/user.php | Updates log when privacy request is confirmed. |
_wp_privacy_send_request_confirmation_notification()wp-includes/user.php | Notifies the site administrator via email when a request is confirmed. |
_wp_privacy_send_erasure_fulfillment_notification()wp-includes/user.php | Notifies the user when their erasure request is fulfilled. |
wp_privacy_process_personal_data_export_page()wp-admin/includes/privacy-tools.php | Intercept personal data exporter page Ajax responses in order to assemble the personal data export file. |
wp_privacy_generate_personal_data_export_file()wp-admin/includes/privacy-tools.php | Generate the personal data export file. |
_wp_privacy_completed_request()wp-admin/includes/privacy-tools.php | Marks a request as completed by the admin and logs the current timestamp. |
WP_Customize_Manager::set_changeset_lock()wp-includes/class-wp-customize-manager.php | Marks the changeset post as being currently edited by the current user. |
WP_Customize_Manager::refresh_changeset_lock()wp-includes/class-wp-customize-manager.php | Refreshes changeset lock with the current time if current user edited the changeset before. |
WP_Customize_Manager::dismiss_user_auto_draft_changesets()wp-includes/class-wp-customize-manager.php | Dismisses all of the current user’s auto-drafts (other than the present one). |
WP_Customize_Manager::import_theme_starter_content()wp-includes/class-wp-customize-manager.php | Imports theme starter content into the customized state. |
WP_REST_Attachments_Controller::create_item()wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php | Creates a single attachment. |
WP_REST_Attachments_Controller::update_item()wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php | Updates a single attachment. |
WP_REST_Posts_Controller::handle_template()wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php | Sets the template for a post. |
Custom_Background::ajax_background_add()wp-admin/includes/class-custom-background.php | Handles Ajax request for adding custom background context to an attachment. |
wp_restore_image()wp-admin/includes/image-edit.php | Restores the metadata for a given attachment. |
wp_save_image()wp-admin/includes/image-edit.php | Saves image to post, along with enqueued changes in |
wp_generate_attachment_metadata()wp-admin/includes/image.php | Generates attachment meta data and create image sub-sizes for images. |
media_upload_form_handler()wp-admin/includes/media.php | Handles form submissions for the legacy media uploader. |
wp_set_post_lock()wp-admin/includes/post.php | Marks the post as currently being edited by the current user. |
edit_post()wp-admin/includes/post.php | Updates an existing post with values provided in |
bulk_edit_posts()wp-admin/includes/post.php | Processes the post data for the bulk editing of posts. |
wp_ajax_upload_attachment()wp-admin/includes/ajax-actions.php | Handles uploading attachments via AJAX. |
wp_ajax_wp_remove_post_lock()wp-admin/includes/ajax-actions.php | Handles removing a post lock via AJAX. |
wp_ajax_save_attachment()wp-admin/includes/ajax-actions.php | Handles updating attachment attributes via AJAX. |
Custom_Image_Header::ajax_header_add()wp-admin/includes/class-custom-image-header.php | Given an attachment ID for a header image, updates its “last used” timestamp to now. |
Custom_Image_Header::customize_set_last_used()wp-admin/includes/class-custom-image-header.php | Updates the last-used postmeta on a header image attachment after saving a new header image via the Customizer. |
Custom_Image_Header::set_header_image()wp-admin/includes/class-custom-image-header.php | Chooses a header image, selected from existing uploaded and default headers, or provides an array of uploaded header data (either new, or from media library). |
Custom_Background::wp_set_background_image()wp-admin/includes/class-custom-background.php | |
Custom_Background::handle_upload()wp-admin/includes/class-custom-background.php | Handles an Image upload for the background image. |
WP_Embed::shortcode()wp-includes/class-wp-embed.php | The do_shortcode() callback function. |
set_post_thumbnail()wp-includes/post.php | Sets the post thumbnail (featured image) for the given post. |
wp_update_attachment_metadata()wp-includes/post.php | Updates metadata for an attachment. |
wp_insert_post()wp-includes/post.php | Inserts or update a post. |
update_attached_file()wp-includes/post.php | Updates attachment file path based on attachment ID. |
wp_restore_post_revision()wp-includes/revision.php | Restores a post to the specified revision. |
wp_update_nav_menu_item()wp-includes/nav-menu.php | Saves the properties of a menu item or create a new one. |
Changelog
Version | Description |
---|---|
1.5.0 | Introduced. |
Note that this function will also return
false
when$meta_value
is equal to the value you try to update in database.Update the template used by a page,
Note: if there are multiple values for a single key, all the values will get updated if $prev_value is not set.
¡IMPORTANT If you are working with serialized data, the array is updated with an extra nested array
In order to keep the same structure, update the Object in the 1rst nested position.
Other Examples
Assuming a post has an ID of 76, and the following 4 custom fields:
[key_1] => 'Happy'
[key_1] => 'Sad'
[key_2] => 'Gregory'
[my_key] => 'Steve'
To change key_2’s value to Hans:
To change key_1’s value from Sad to Happy:
The fields would now look like this:
[key_1] => 'Happy'
[key_1] => 'Happy'
[key_2] => 'Hans'
[my_key] => 'Steve'
Note: This function will update only the first field that matches the criteria.
To change the first key_1’s value from Happy to Excited:
Edit Page template
[/php]
For a more detailed example, go to the post_meta Functions Examples page.
Please note that if your database collation is case insensitive (as with suffix _ci) then
update_post_meta()
and delete_post_meta() and get_posts() will update/delete/query the meta records with keys that are upper or lower case. However get_post_meta() will be case sensitive due to WordPress caching. See https://core.trac.wordpress.org/ticket/18210 for more info.Default Usage