diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-admin/revision.php --- a/wp/wp-admin/revision.php Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-admin/revision.php Tue Dec 15 13:49:49 2020 +0100 @@ -10,7 +10,7 @@ */ /** WordPress Administration Bootstrap */ -require_once( dirname( __FILE__ ) . '/admin.php' ); +require_once __DIR__ . '/admin.php'; require ABSPATH . 'wp-admin/includes/revision.php'; @@ -33,7 +33,8 @@ switch ( $action ) { case 'restore': - if ( ! $revision = wp_get_post_revision( $revision_id ) ) { + $revision = wp_get_post_revision( $revision_id ); + if ( ! $revision ) { break; } @@ -41,24 +42,36 @@ break; } - if ( ! $post = get_post( $revision->post_parent ) ) { + $post = get_post( $revision->post_parent ); + if ( ! $post ) { break; } - // Restore if revisions are enabled or this is an autosave. + // Don't restore if revisions are disabled and this is not an autosave. if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) { $redirect = 'edit.php?post_type=' . $post->post_type; break; } - // Don't allow revision restore when post is locked + // Don't restore if the post is locked. if ( wp_check_post_lock( $post->ID ) ) { break; } check_admin_referer( "restore-post_{$revision->ID}" ); + /* + * Ensure the global $post remains the same after revision is restored. + * Because wp_insert_post() and wp_transition_post_status() are called + * during the process, plugins can unexpectedly modify $post. + */ + $backup_global_post = clone $post; + wp_restore_post_revision( $revision->ID ); + + // Restore the global $post as it was before. + $post = $backup_global_post; + $redirect = add_query_arg( array( 'message' => 5, @@ -70,10 +83,13 @@ case 'view': case 'edit': default: - if ( ! $revision = wp_get_post_revision( $revision_id ) ) { + $revision = wp_get_post_revision( $revision_id ); + if ( ! $revision ) { break; } - if ( ! $post = get_post( $revision->post_parent ) ) { + + $post = get_post( $revision->post_parent ); + if ( ! $post ) { break; } @@ -81,7 +97,7 @@ break; } - // Revisions disabled and we're not looking at an autosave + // Bail if revisions are disabled and this is not an autosave. if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) { $redirect = 'edit.php?post_type=' . $post->post_type; break; @@ -89,7 +105,7 @@ $post_edit_link = get_edit_post_link(); $post_title = '' . _draft_or_post_title() . ''; - /* translators: %s: post title */ + /* translators: %s: Post title. */ $h1 = sprintf( __( 'Compare Revisions of “%s”' ), $post_title ); $return_to_post = '' . __( '← Return to editor' ) . ''; $title = __( 'Revisions' ); @@ -110,10 +126,11 @@ // This is so that the correct "Edit" menu item is selected. if ( ! empty( $post->post_type ) && 'post' != $post->post_type ) { - $parent_file = $submenu_file = 'edit.php?post_type=' . $post->post_type; + $parent_file = 'edit.php?post_type=' . $post->post_type; } else { - $parent_file = $submenu_file = 'edit.php'; + $parent_file = 'edit.php'; } +$submenu_file = $parent_file; wp_enqueue_script( 'revisions' ); wp_localize_script( 'revisions', '_wpRevisionsSettings', wp_prepare_revisions_for_js( $post, $revision_id, $from ) ); @@ -136,12 +153,12 @@ ); $revisions_sidebar = '
' . __( 'For more information:' ) . '
'; -$revisions_sidebar .= '' . __( 'Revisions Management' ) . '
'; +$revisions_sidebar .= '' . __( 'Revisions Management' ) . '
'; $revisions_sidebar .= '' . __( 'Support' ) . '
'; get_current_screen()->set_help_sidebar( $revisions_sidebar ); -require_once( ABSPATH . 'wp-admin/admin-header.php' ); +require_once ABSPATH . 'wp-admin/admin-header.php'; ?> @@ -152,4 +169,4 @@