WordPress Version: 6.4
/**
* Creates autosave data for the specified post from `$_POST` data.
*
* @since 2.6.0
*
* @param array|int $post_data Associative array containing the post data, or integer post ID.
* If a numeric post ID is provided, will use the `$_POST` superglobal.
* @return int|WP_Error The autosave revision ID. WP_Error or 0 on error.
*/
function wp_create_post_autosave($post_data)
{
if (is_numeric($post_data)) {
$post_id = $post_data;
$post_data = $_POST;
} else {
$post_id = (int) $post_data['post_ID'];
}
$post_data = _wp_translate_postdata(true, $post_data);
if (is_wp_error($post_data)) {
return $post_data;
}
$post_data = _wp_get_allowed_postdata($post_data);
$post_author = get_current_user_id();
// Store one autosave per author. If there is already an autosave, overwrite it.
$old_autosave = wp_get_post_autosave($post_id, $post_author);
if ($old_autosave) {
$new_autosave = _wp_post_revision_data($post_data, true);
$new_autosave['ID'] = $old_autosave->ID;
$new_autosave['post_author'] = $post_author;
$post = get_post($post_id);
// If the new autosave has the same content as the post, delete the autosave.
$autosave_is_different = false;
foreach (array_intersect(array_keys($new_autosave), array_keys(_wp_post_revision_fields($post))) as $field) {
if (normalize_whitespace($new_autosave[$field]) !== normalize_whitespace($post->{$field})) {
$autosave_is_different = true;
break;
}
}
if (!$autosave_is_different) {
wp_delete_post_revision($old_autosave->ID);
return 0;
}
/**
* Fires before an autosave is stored.
*
* @since 4.1.0
* @since 6.4.0 The `$is_update` parameter was added to indicate if the autosave is being updated or was newly created.
*
* @param array $new_autosave Post array - the autosave that is about to be saved.
* @param bool $is_update Whether this is an existing autosave.
*/
do_action('wp_creating_autosave', $new_autosave, true);
return wp_update_post($new_autosave);
}
// _wp_put_post_revision() expects unescaped.
$post_data = wp_unslash($post_data);
// Otherwise create the new autosave as a special post revision.
$revision = _wp_put_post_revision($post_data, true);
if (!is_wp_error($revision) && 0 !== $revision) {
/** This action is documented in wp-admin/includes/post.php */
do_action('wp_creating_autosave', get_post($revision, ARRAY_A), false);
}
return $revision;
}