8 * @subpackage Administration |
8 * @subpackage Administration |
9 * @since 2.6.0 |
9 * @since 2.6.0 |
10 */ |
10 */ |
11 |
11 |
12 /** WordPress Administration Bootstrap */ |
12 /** WordPress Administration Bootstrap */ |
13 require_once( dirname( __FILE__ ) . '/admin.php' ); |
13 require_once __DIR__ . '/admin.php'; |
14 |
14 |
15 require ABSPATH . 'wp-admin/includes/revision.php'; |
15 require ABSPATH . 'wp-admin/includes/revision.php'; |
16 |
16 |
17 /** |
17 /** |
18 * @global int $revision Optional. The revision ID. |
18 * @global int $revision Optional. The revision ID. |
31 } |
31 } |
32 $redirect = 'edit.php'; |
32 $redirect = 'edit.php'; |
33 |
33 |
34 switch ( $action ) { |
34 switch ( $action ) { |
35 case 'restore': |
35 case 'restore': |
36 if ( ! $revision = wp_get_post_revision( $revision_id ) ) { |
36 $revision = wp_get_post_revision( $revision_id ); |
|
37 if ( ! $revision ) { |
37 break; |
38 break; |
38 } |
39 } |
39 |
40 |
40 if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) { |
41 if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) { |
41 break; |
42 break; |
42 } |
43 } |
43 |
44 |
44 if ( ! $post = get_post( $revision->post_parent ) ) { |
45 $post = get_post( $revision->post_parent ); |
|
46 if ( ! $post ) { |
45 break; |
47 break; |
46 } |
48 } |
47 |
49 |
48 // Restore if revisions are enabled or this is an autosave. |
50 // Don't restore if revisions are disabled and this is not an autosave. |
49 if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) { |
51 if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) { |
50 $redirect = 'edit.php?post_type=' . $post->post_type; |
52 $redirect = 'edit.php?post_type=' . $post->post_type; |
51 break; |
53 break; |
52 } |
54 } |
53 |
55 |
54 // Don't allow revision restore when post is locked |
56 // Don't restore if the post is locked. |
55 if ( wp_check_post_lock( $post->ID ) ) { |
57 if ( wp_check_post_lock( $post->ID ) ) { |
56 break; |
58 break; |
57 } |
59 } |
58 |
60 |
59 check_admin_referer( "restore-post_{$revision->ID}" ); |
61 check_admin_referer( "restore-post_{$revision->ID}" ); |
60 |
62 |
|
63 /* |
|
64 * Ensure the global $post remains the same after revision is restored. |
|
65 * Because wp_insert_post() and wp_transition_post_status() are called |
|
66 * during the process, plugins can unexpectedly modify $post. |
|
67 */ |
|
68 $backup_global_post = clone $post; |
|
69 |
61 wp_restore_post_revision( $revision->ID ); |
70 wp_restore_post_revision( $revision->ID ); |
|
71 |
|
72 // Restore the global $post as it was before. |
|
73 $post = $backup_global_post; |
|
74 |
62 $redirect = add_query_arg( |
75 $redirect = add_query_arg( |
63 array( |
76 array( |
64 'message' => 5, |
77 'message' => 5, |
65 'revision' => $revision->ID, |
78 'revision' => $revision->ID, |
66 ), |
79 ), |
68 ); |
81 ); |
69 break; |
82 break; |
70 case 'view': |
83 case 'view': |
71 case 'edit': |
84 case 'edit': |
72 default: |
85 default: |
73 if ( ! $revision = wp_get_post_revision( $revision_id ) ) { |
86 $revision = wp_get_post_revision( $revision_id ); |
|
87 if ( ! $revision ) { |
74 break; |
88 break; |
75 } |
89 } |
76 if ( ! $post = get_post( $revision->post_parent ) ) { |
90 |
|
91 $post = get_post( $revision->post_parent ); |
|
92 if ( ! $post ) { |
77 break; |
93 break; |
78 } |
94 } |
79 |
95 |
80 if ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'edit_post', $revision->post_parent ) ) { |
96 if ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'edit_post', $revision->post_parent ) ) { |
81 break; |
97 break; |
82 } |
98 } |
83 |
99 |
84 // Revisions disabled and we're not looking at an autosave |
100 // Bail if revisions are disabled and this is not an autosave. |
85 if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) { |
101 if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) { |
86 $redirect = 'edit.php?post_type=' . $post->post_type; |
102 $redirect = 'edit.php?post_type=' . $post->post_type; |
87 break; |
103 break; |
88 } |
104 } |
89 |
105 |
90 $post_edit_link = get_edit_post_link(); |
106 $post_edit_link = get_edit_post_link(); |
91 $post_title = '<a href="' . $post_edit_link . '">' . _draft_or_post_title() . '</a>'; |
107 $post_title = '<a href="' . $post_edit_link . '">' . _draft_or_post_title() . '</a>'; |
92 /* translators: %s: post title */ |
108 /* translators: %s: Post title. */ |
93 $h1 = sprintf( __( 'Compare Revisions of “%s”' ), $post_title ); |
109 $h1 = sprintf( __( 'Compare Revisions of “%s”' ), $post_title ); |
94 $return_to_post = '<a href="' . $post_edit_link . '">' . __( '← Return to editor' ) . '</a>'; |
110 $return_to_post = '<a href="' . $post_edit_link . '">' . __( '← Return to editor' ) . '</a>'; |
95 $title = __( 'Revisions' ); |
111 $title = __( 'Revisions' ); |
96 |
112 |
97 $redirect = false; |
113 $redirect = false; |
108 exit; |
124 exit; |
109 } |
125 } |
110 |
126 |
111 // This is so that the correct "Edit" menu item is selected. |
127 // This is so that the correct "Edit" menu item is selected. |
112 if ( ! empty( $post->post_type ) && 'post' != $post->post_type ) { |
128 if ( ! empty( $post->post_type ) && 'post' != $post->post_type ) { |
113 $parent_file = $submenu_file = 'edit.php?post_type=' . $post->post_type; |
129 $parent_file = 'edit.php?post_type=' . $post->post_type; |
114 } else { |
130 } else { |
115 $parent_file = $submenu_file = 'edit.php'; |
131 $parent_file = 'edit.php'; |
116 } |
132 } |
|
133 $submenu_file = $parent_file; |
117 |
134 |
118 wp_enqueue_script( 'revisions' ); |
135 wp_enqueue_script( 'revisions' ); |
119 wp_localize_script( 'revisions', '_wpRevisionsSettings', wp_prepare_revisions_for_js( $post, $revision_id, $from ) ); |
136 wp_localize_script( 'revisions', '_wpRevisionsSettings', wp_prepare_revisions_for_js( $post, $revision_id, $from ) ); |
120 |
137 |
121 /* Revisions Help Tab */ |
138 /* Revisions Help Tab */ |
134 'content' => $revisions_overview, |
151 'content' => $revisions_overview, |
135 ) |
152 ) |
136 ); |
153 ); |
137 |
154 |
138 $revisions_sidebar = '<p><strong>' . __( 'For more information:' ) . '</strong></p>'; |
155 $revisions_sidebar = '<p><strong>' . __( 'For more information:' ) . '</strong></p>'; |
139 $revisions_sidebar .= '<p>' . __( '<a href="https://codex.wordpress.org/Revision_Management">Revisions Management</a>' ) . '</p>'; |
156 $revisions_sidebar .= '<p>' . __( '<a href="https://wordpress.org/support/article/revisions/">Revisions Management</a>' ) . '</p>'; |
140 $revisions_sidebar .= '<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>'; |
157 $revisions_sidebar .= '<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>'; |
141 |
158 |
142 get_current_screen()->set_help_sidebar( $revisions_sidebar ); |
159 get_current_screen()->set_help_sidebar( $revisions_sidebar ); |
143 |
160 |
144 require_once( ABSPATH . 'wp-admin/admin-header.php' ); |
161 require_once ABSPATH . 'wp-admin/admin-header.php'; |
145 |
162 |
146 ?> |
163 ?> |
147 |
164 |
148 <div class="wrap"> |
165 <div class="wrap"> |
149 <h1 class="long-header"><?php echo $h1; ?></h1> |
166 <h1 class="long-header"><?php echo $h1; ?></h1> |
150 <?php echo $return_to_post; ?> |
167 <?php echo $return_to_post; ?> |
151 </div> |
168 </div> |
152 <?php |
169 <?php |
153 wp_print_revision_templates(); |
170 wp_print_revision_templates(); |
154 |
171 |
155 require_once( ABSPATH . 'wp-admin/admin-footer.php' ); |
172 require_once ABSPATH . 'wp-admin/admin-footer.php'; |