wp_save_post_revision( int $post_id )
Creates a revision for the current version of a post.
Description
Typically used immediately after a post update, as every update is a revision, and the most recent revision always matches the current post.
Parameters
- $post_id
-
(Required) The ID of the post to save as a revision.
Return
(int|WP_Error|void) Void or 0 if error, new revision ID, if success.
Source
File: wp-includes/revision.php
function wp_save_post_revision( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( ! $post = get_post( $post_id ) )
return;
if ( ! post_type_supports( $post->post_type, 'revisions' ) )
return;
if ( 'auto-draft' == $post->post_status )
return;
if ( ! wp_revisions_enabled( $post ) )
return;
// Compare the proposed update with the last stored revision verifying that
// they are different, unless a plugin tells us to always save regardless.
// If no previous revisions, save one
if ( $revisions = wp_get_post_revisions( $post_id ) ) {
// grab the last revision, but not an autosave
foreach ( $revisions as $revision ) {
if ( false !== strpos( $revision->post_name, "{$revision->post_parent}-revision" ) ) {
$last_revision = $revision;
break;
}
}
/**
* Filters whether the post has changed since the last revision.
*
* By default a revision is saved only if one of the revisioned fields has changed.
* This filter can override that so a revision is saved even if nothing has changed.
*
* @since WP-3.6.0
*
* @param bool $check_for_changes Whether to check for changes before saving a new revision.
* Default true.
* @param WP_Post $last_revision The last revision post object.
* @param WP_Post $post The post object.
*
*/
if ( isset( $last_revision ) && apply_filters( 'wp_save_post_revision_check_for_changes', $check_for_changes = true, $last_revision, $post ) ) {
$post_has_changed = false;
foreach ( array_keys( _wp_post_revision_fields( $post ) ) as $field ) {
if ( normalize_whitespace( $post->$field ) != normalize_whitespace( $last_revision->$field ) ) {
$post_has_changed = true;
break;
}
}
/**
* Filters whether a post has changed.
*
* By default a revision is saved only if one of the revisioned fields has changed.
* This filter allows for additional checks to determine if there were changes.
*
* @since WP-4.1.0
*
* @param bool $post_has_changed Whether the post has changed.
* @param WP_Post $last_revision The last revision post object.
* @param WP_Post $post The post object.
*
*/
$post_has_changed = (bool) apply_filters( 'wp_save_post_revision_post_has_changed', $post_has_changed, $last_revision, $post );
//don't save revision if post unchanged
if ( ! $post_has_changed ) {
return;
}
}
}
$return = _wp_put_post_revision( $post );
// If a limit for the number of revisions to keep has been set,
// delete the oldest ones.
$revisions_to_keep = wp_revisions_to_keep( $post );
if ( $revisions_to_keep < 0 )
return $return;
$revisions = wp_get_post_revisions( $post_id, array( 'order' => 'ASC' ) );
$delete = count($revisions) - $revisions_to_keep;
if ( $delete < 1 )
return $return;
$revisions = array_slice( $revisions, 0, $delete );
for ( $i = 0; isset( $revisions[$i] ); $i++ ) {
if ( false !== strpos( $revisions[ $i ]->post_name, 'autosave' ) )
continue;
wp_delete_post_revision( $revisions[ $i ]->ID );
}
return $return;
}
Changelog
Version | Description |
---|---|
WP-2.6.0 | Introduced. |