为当前版本的帖子创建修订。
原型
wp_save_post_revision( int $post_id )
描述
通常在更新后立即使用,因为每次更新都是修订版,并且最新版本始终与当前帖子匹配。
参数
$post_id
(int)
(Required)
要保存为修订的帖子的ID。
返回值
(int|WP_Error|void)
Void或0如果错误,新版本ID,如果成功。
源文件
路径:wp-includes/revision.php
<?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 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 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;
}
...
?>
其他
英文文档:https://developer.wordpress.org/reference/functions/wp_save_post_revision/