Title: WP_REST_Autosaves_Controller::create_post_autosave
Published: December 6, 2018
Last modified: May 20, 2026

---

# WP_REST_Autosaves_Controller::create_post_autosave( array $post_data, array $meta = array() ): mixed

## In this article

 * [Description](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#description)
 * [Parameters](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#wp--skip-link--target)

Creates autosave for the specified post.

## 󠀁[Description](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#description)󠁿

From wp-admin/post.php.

## 󠀁[Parameters](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#parameters)󠁿

 `$post_data`arrayrequired

Associative array containing the post data.

`$meta`arrayoptional

Associative array containing the post meta data.

Default:`array()`

## 󠀁[Return](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#return)󠁿

 mixed The autosave revision ID or [WP_Error](https://developer.wordpress.org/reference/classes/wp_error/).

## 󠀁[Source](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#source)󠁿

    ```php
    public function create_post_autosave( $post_data, array $meta = array() ) {

    	$post_id = (int) $post_data['ID'];
    	$post    = get_post( $post_id );

    	if ( is_wp_error( $post ) ) {
    		return $post;
    	}

    	// Only create an autosave when it is different from the saved post.
    	$autosave_is_different = false;
    	$new_autosave          = _wp_post_revision_data( $post_data, true );

    	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;
    		}
    	}

    	// Check if meta values have changed.
    	if ( ! empty( $meta ) ) {
    		$revisioned_meta_keys = wp_post_revision_meta_keys( $post->post_type );
    		foreach ( $revisioned_meta_keys as $meta_key ) {
    			// get_metadata_raw is used to avoid retrieving the default value.
    			$old_meta = get_metadata_raw( 'post', $post_id, $meta_key, true );
    			$new_meta = $meta[ $meta_key ] ?? '';

    			if ( $new_meta !== $old_meta ) {
    				$autosave_is_different = true;
    				break;
    			}
    		}
    	}

    	$user_id = 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, $user_id );

    	if ( ! $autosave_is_different && $old_autosave ) {
    		// Nothing to save, return the existing autosave.
    		return $old_autosave->ID;
    	}

    	if ( $old_autosave ) {
    		$new_autosave['ID']          = $old_autosave->ID;
    		$new_autosave['post_author'] = $user_id;

    		/** This action is documented in wp-admin/includes/post.php */
    		do_action( 'wp_creating_autosave', $new_autosave );

    		// wp_update_post() expects escaped array.
    		$revision_id = wp_update_post( wp_slash( $new_autosave ) );
    	} else {
    		// Create the new autosave as a special post revision.
    		$revision_id = _wp_put_post_revision( $post_data, true );
    	}

    	if ( is_wp_error( $revision_id ) || 0 === $revision_id ) {
    		return $revision_id;
    	}

    	// Attached any passed meta values that have revisions enabled.
    	if ( ! empty( $meta ) ) {
    		foreach ( $revisioned_meta_keys as $meta_key ) {
    			if ( isset( $meta[ $meta_key ] ) ) {
    				update_metadata( 'post', $revision_id, $meta_key, wp_slash( $meta[ $meta_key ] ) );
    			}
    		}
    	}

    	return $revision_id;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.0/src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php#L378)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.0/src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php#L378-L451)

## 󠀁[Hooks](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#hooks)󠁿

 [do_action( ‘wp_creating_autosave’, array $new_autosave, bool $is_update )](https://developer.wordpress.org/reference/hooks/wp_creating_autosave/)

Fires before an autosave is stored.

## 󠀁[Related](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#related)󠁿

| Uses | Description | 
| [wp_post_revision_meta_keys()](https://developer.wordpress.org/reference/functions/wp_post_revision_meta_keys/)`wp-includes/revision.php` |

Determine which post meta fields should be revisioned.

  | 
| [get_metadata_raw()](https://developer.wordpress.org/reference/functions/get_metadata_raw/)`wp-includes/meta.php` |

Retrieves raw metadata value for the specified object.

  | 
| [_wp_post_revision_data()](https://developer.wordpress.org/reference/functions/_wp_post_revision_data/)`wp-includes/revision.php` |

Returns a post array ready to be inserted into the posts table as a post revision.

  | 
| [normalize_whitespace()](https://developer.wordpress.org/reference/functions/normalize_whitespace/)`wp-includes/formatting.php` |

Normalizes EOL characters and strips duplicate whitespace.

  | 
| [wp_update_post()](https://developer.wordpress.org/reference/functions/wp_update_post/)`wp-includes/post.php` |

Updates a post with new post data.

  | 
| [_wp_put_post_revision()](https://developer.wordpress.org/reference/functions/_wp_put_post_revision/)`wp-includes/revision.php` |

Inserts post data into the posts table as a post revision.

  | 
| [_wp_post_revision_fields()](https://developer.wordpress.org/reference/functions/_wp_post_revision_fields/)`wp-includes/revision.php` |

Determines which fields of posts are to be saved in revisions.

  | 
| [wp_get_post_autosave()](https://developer.wordpress.org/reference/functions/wp_get_post_autosave/)`wp-includes/revision.php` |

Retrieves the autosaved data of the specified post.

  | 
| [update_metadata()](https://developer.wordpress.org/reference/functions/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.

  | 
| [wp_slash()](https://developer.wordpress.org/reference/functions/wp_slash/)`wp-includes/formatting.php` |

Adds slashes to a string or recursively adds slashes to strings within an array.

  | 
| [do_action()](https://developer.wordpress.org/reference/functions/do_action/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to an action hook.

  | 
| [get_current_user_id()](https://developer.wordpress.org/reference/functions/get_current_user_id/)`wp-includes/user.php` |

Gets the current user’s ID.

  | 
| [get_post()](https://developer.wordpress.org/reference/functions/get_post/)`wp-includes/post.php` |

Retrieves post data given a post ID or post object.

  | 
| [is_wp_error()](https://developer.wordpress.org/reference/functions/is_wp_error/)`wp-includes/load.php` |

Checks whether the given variable is a WordPress Error.

  |

[Show 9 more](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#)

| Used by | Description | 
| [WP_REST_Autosaves_Controller::create_item()](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_item/)`wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php` |

Creates, updates or deletes an autosave revision.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/wp_rest_autosaves_controller/create_post_autosave/?output_format=md#changelog)󠁿

| Version | Description | 
| [6.4.0](https://developer.wordpress.org/reference/since/6.4.0/) | The `$meta` parameter was added. | 
| [5.0.0](https://developer.wordpress.org/reference/since/5.0.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwp_rest_autosaves_controller%2Fcreate_post_autosave%2F)
before being able to contribute a note or feedback.