diff --git a/src/wp-admin/edit-form-advanced.php b/src/wp-admin/edit-form-advanced.php index c5092029543db..9e1a95bf2233e 100644 --- a/src/wp-admin/edit-form-advanced.php +++ b/src/wp-admin/edit-form-advanced.php @@ -237,6 +237,20 @@ $nonce_action = 'update-post_' . $post->ID; $form_extra .= ""; +// If an autosave was restored from the revision screen, load it into the editor. +$restored_autosave = false; +if ( ! empty( $_GET['restored_autosave'] ) ) { + $restored_autosave_id = absint( $_GET['restored_autosave'] ); + $restored_autosave = wp_get_post_revision( $restored_autosave_id ); + if ( $restored_autosave && $restored_autosave->post_parent === $post->ID && wp_is_post_autosave( $restored_autosave ) ) { + $post->post_title = $restored_autosave->post_title; + $post->post_content = $restored_autosave->post_content; + $post->post_excerpt = $restored_autosave->post_excerpt; + + $notice = __( 'The autosave has been loaded into the editor. Review your changes and click Update to publish them.' ); + } +} + // Detect if there exists an autosave newer than the post and if that autosave is different than the post. if ( $autosave && mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) { foreach ( _wp_post_revision_fields( $post ) as $autosave_field => $_autosave_field ) { @@ -251,7 +265,10 @@ } // If this autosave isn't different from the current post, begone. if ( ! $notice ) { - wp_delete_post_revision( $autosave->ID ); + // Don't delete the autosave if it's the one we just restored. + if ( ! $restored_autosave || $restored_autosave->ID !== $autosave->ID ) { + wp_delete_post_revision( $autosave->ID ); + } } unset( $autosave_field, $_autosave_field ); } diff --git a/src/wp-admin/edit-form-blocks.php b/src/wp-admin/edit-form-blocks.php index 2237fc69ce293..a7ad6bc013ca7 100644 --- a/src/wp-admin/edit-form-blocks.php +++ b/src/wp-admin/edit-form-blocks.php @@ -147,6 +147,19 @@ static function ( $classes ) { } } +// If an autosave was restored from the revision screen, load it as initial edits. +$restored_autosave_id = ! empty( $_GET['restored_autosave'] ) ? absint( $_GET['restored_autosave'] ) : 0; +if ( $restored_autosave_id ) { + $restored_autosave = wp_get_post_revision( $restored_autosave_id ); + if ( $restored_autosave && $restored_autosave->post_parent === $post->ID && wp_is_post_autosave( $restored_autosave ) ) { + $initial_edits = array( + 'title' => $restored_autosave->post_title, + 'content' => $restored_autosave->post_content, + 'excerpt' => $restored_autosave->post_excerpt, + ); + } +} + // Preload server-registered block schemas. wp_add_inline_script( 'wp-blocks', @@ -299,6 +312,10 @@ static function ( $classes ) { } } +if ( $restored_autosave_id && ! empty( $initial_edits ) ) { + unset( $editor_settings['autosave'] ); +} + if ( ! empty( $post_type_object->template ) ) { $editor_settings['template'] = $post_type_object->template; $editor_settings['templateLock'] = ! empty( $post_type_object->template_lock ) ? $post_type_object->template_lock : false; diff --git a/src/wp-admin/includes/revision.php b/src/wp-admin/includes/revision.php index 979576ecde92c..d7728257285a3 100644 --- a/src/wp-admin/includes/revision.php +++ b/src/wp-admin/includes/revision.php @@ -454,7 +454,14 @@ function wp_print_revision_templates() { <# } #> <# if ( data.attributes.autosave ) { #> - type="button" class="restore-revision button button-primary" value="" /> + type="button" class="restore-revision button button-primary" value=" + post_status, array( 'publish', 'future', 'private' ), true ) + ? __( 'Load This Autosave in Editor' ) + : __( 'Restore This Autosave' ); + echo esc_attr( $restore_autosave_label ); + ?> + " /> <# } else { #> type="button" class="restore-revision button button-primary" value="" /> <# } #> diff --git a/src/wp-admin/revision.php b/src/wp-admin/revision.php index d5ab873666e23..c33afb740c91e 100644 --- a/src/wp-admin/revision.php +++ b/src/wp-admin/revision.php @@ -61,6 +61,14 @@ check_admin_referer( "restore-post_{$revision->ID}" ); + if ( wp_is_post_autosave( $revision ) && in_array( $post->post_status, array( 'publish', 'future', 'private' ), true ) ) { + $redirect = add_query_arg( + array( 'restored_autosave' => $revision->ID ), + get_edit_post_link( $post->ID, 'url' ) + ); + break; + } + /* * Ensure the global $post remains the same after revision is restored. * Because wp_insert_post() and wp_transition_post_status() are called