wp/wp-admin/revision.php
changeset 16 a86126ab1dd4
parent 9 177826044cd9
child 18 be944660c56a
--- 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     = '<a href="' . $post_edit_link . '">' . _draft_or_post_title() . '</a>';
-		/* translators: %s: post title */
+		/* translators: %s: Post title. */
 		$h1             = sprintf( __( 'Compare Revisions of &#8220;%s&#8221;' ), $post_title );
 		$return_to_post = '<a href="' . $post_edit_link . '">' . __( '&larr; Return to editor' ) . '</a>';
 		$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  = '<p><strong>' . __( 'For more information:' ) . '</strong></p>';
-$revisions_sidebar .= '<p>' . __( '<a href="https://codex.wordpress.org/Revision_Management">Revisions Management</a>' ) . '</p>';
+$revisions_sidebar .= '<p>' . __( '<a href="https://wordpress.org/support/article/revisions/">Revisions Management</a>' ) . '</p>';
 $revisions_sidebar .= '<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>';
 
 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 @@
 <?php
 wp_print_revision_templates();
 
-require_once( ABSPATH . 'wp-admin/admin-footer.php' );
+require_once ABSPATH . 'wp-admin/admin-footer.php';