Ticket #23022: 23022.2.diff
File 23022.2.diff, 8.7 KB (added by , 4 years ago) |
---|
-
src/wp-admin/edit.php
134 134 break; 135 135 case 'untrash': 136 136 $untrashed = 0; 137 138 if ( isset( $_GET['doaction'] ) && ( 'undo' === $_GET['doaction'] ) ) { 139 add_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 ); 140 } 141 137 142 foreach ( (array) $post_ids as $post_id ) { 138 143 if ( ! current_user_can( 'delete_post', $post_id ) ) { 139 144 wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) ); … … 146 151 $untrashed++; 147 152 } 148 153 $sendback = add_query_arg( 'untrashed', $untrashed, $sendback ); 154 155 remove_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 ); 156 149 157 break; 150 158 case 'delete': 151 159 $deleted = 0; … … 419 427 $ids = preg_replace( '/[^0-9,]/', '', $_REQUEST['ids'] ); 420 428 $messages[] = '<a href="' . esc_url( wp_nonce_url( "edit.php?post_type=$post_type&doaction=undo&action=untrash&ids=$ids", 'bulk-posts' ) ) . '">' . __( 'Undo' ) . '</a>'; 421 429 } 430 431 if ( 'untrashed' === $message && isset( $_REQUEST['ids'] ) ) { 432 $ids = explode( ',', $_REQUEST['ids'] ); 433 434 if ( 1 === count( $ids ) && current_user_can( 'edit_post', $ids[0] ) ) { 435 $messages[] = sprintf( 436 '<a href="%1$s">%2$s</a>', 437 esc_url( get_edit_post_link( $ids[0] ) ), 438 esc_html( get_post_type_object( get_post_type( $ids[0] ) )->labels->edit_item ) 439 ); 440 } 441 } 422 442 } 423 443 424 444 if ( $messages ) { -
src/wp-admin/post.php
291 291 wp_die( __( 'Error in restoring the item from Trash.' ) ); 292 292 } 293 293 294 wp_redirect( add_query_arg( 'untrashed', 1, $sendback ) ); 294 $sendback = add_query_arg( 295 array( 296 'untrashed' => 1, 297 'ids' => $post_id, 298 ), 299 $sendback 300 ); 301 wp_redirect( $sendback ); 295 302 exit; 296 303 297 304 case 'delete': -
src/wp-includes/functions.php
1193 1193 'error', 1194 1194 'hotkeys_highlight_first', 1195 1195 'hotkeys_highlight_last', 1196 'ids', 1196 1197 'locked', 1197 1198 'message', 1198 1199 'same', -
src/wp-includes/post.php
3233 3233 } 3234 3234 3235 3235 /** 3236 * Restore a post or pagefrom the Trash.3236 * Restores a post from the Trash. 3237 3237 * 3238 3238 * @since 2.9.0 3239 * @since 5.6.0 An untrashed post is now returned to `draft` status by default. 3239 3240 * 3240 3241 * @param int $post_id Optional. Post ID. Default is ID of the global $post. 3241 3242 * @return WP_Post|false|null Post data on success, false or null on failure. … … 3247 3248 return $post; 3248 3249 } 3249 3250 3251 $post_id = $post->ID; 3252 3250 3253 if ( 'trash' !== $post->post_status ) { 3251 3254 return false; 3252 3255 } 3253 3256 3257 $previous_status = get_post_meta( $post_id, '_wp_trash_meta_status', true ); 3258 3254 3259 /** 3255 3260 * Filters whether a post untrashing should take place. 3256 3261 * 3257 3262 * @since 4.9.0 3263 * @since 5.6.0 The `$previous_status` parameter was added. 3258 3264 * 3259 * @param bool|null $untrash Whether to go forward with untrashing. 3260 * @param WP_Post $post Post object. 3265 * @param bool|null $untrash Whether to go forward with untrashing. 3266 * @param WP_Post $post Post object. 3267 * @param string $previous_status The status of the post at the point where it was trashed. 3261 3268 */ 3262 $check = apply_filters( 'pre_untrash_post', null, $post );3269 $check = apply_filters( 'pre_untrash_post', null, $post, $previous_status ); 3263 3270 if ( null !== $check ) { 3264 3271 return $check; 3265 3272 } … … 3268 3275 * Fires before a post is restored from the Trash. 3269 3276 * 3270 3277 * @since 2.9.0 3278 * @since 5.6.0 The `$previous_status` parameter was added. 3271 3279 * 3272 * @param int $post_id Post ID. 3280 * @param int $post_id Post ID. 3281 * @param string $previous_status The status of the post at the point where it was trashed. 3273 3282 */ 3274 do_action( 'untrash_post', $post_id );3283 do_action( 'untrash_post', $post_id, $previous_status ); 3275 3284 3276 $post_status = get_post_meta( $post_id, '_wp_trash_meta_status', true ); 3285 $new_status = ( 'attachment' === $post->post_type ) ? 'inherit' : 'draft'; 3286 3287 /** 3288 * Filters the status that a post gets assigned when it is restored from the trash (untrashed). 3289 * 3290 * By default posts that are restored will be assigned a status of 'draft'. Return the value of `$previous_status` 3291 * in order to assign the status that the post had before it was trashed. The `wp_untrash_post_set_previous_status()` 3292 * function is available for this. 3293 * 3294 * Prior to WordPress 5.6, restored posts were assigned their original status. 3295 * 3296 * @since 5.6.0 3297 * 3298 * @param string $new_status The new status of the post being restored. 3299 * @param int $post_id The ID of the post being restored. 3300 * @param string $previous_status The status of the post at the point where it was trashed. 3301 */ 3302 $post_status = apply_filters( 'wp_untrash_post_status', $new_status, $post_id, $previous_status ); 3277 3303 3278 3304 delete_post_meta( $post_id, '_wp_trash_meta_status' ); 3279 3305 delete_post_meta( $post_id, '_wp_trash_meta_time' ); … … 3295 3321 * Fires after a post is restored from the Trash. 3296 3322 * 3297 3323 * @since 2.9.0 3324 * @since 5.6.0 The `$previous_status` parameter was added. 3298 3325 * 3299 * @param int $post_id Post ID. 3326 * @param int $post_id Post ID. 3327 * @param string $previous_status The status of the post at the point where it was trashed. 3300 3328 */ 3301 do_action( 'untrashed_post', $post_id );3329 do_action( 'untrashed_post', $post_id, $previous_status ); 3302 3330 3303 3331 return $post; 3304 3332 } … … 7513 7541 */ 7514 7542 return apply_filters( 'wp_get_original_image_url', $original_image_url, $attachment_id ); 7515 7543 } 7544 7545 /** 7546 * Filter callback which sets the status of an untrashed post to its previous status. 7547 * 7548 * This can be used as a callback on the `wp_untrash_post_status` filter. 7549 * 7550 * @since 5.6.0 7551 * 7552 * @param string $new_status The new status of the post being restored. 7553 * @param int $post_id The ID of the post being restored. 7554 * @param string $previous_status The status of the post at the point where it was trashed. 7555 * @return string The new status of the post. 7556 */ 7557 function wp_untrash_post_set_previous_status( $new_status, $post_id, $previous_status ) { 7558 return $previous_status; 7559 } -
tests/phpunit/tests/post/wpInsertPost.php
159 159 ); 160 160 161 161 wp_untrash_post( $about_page_id ); 162 wp_update_post( 163 array( 164 'ID' => $about_page_id, 165 'post_status' => 'publish', 166 ) 167 ); 162 168 163 169 $this->assertSame( 'about', get_post( $another_about_page_id )->post_name ); 164 170 $this->assertSame( 'about-2', get_post( $about_page_id )->post_name ); 165 171 } 166 172 167 173 /** 174 * @ticket 23022 175 * @dataProvider data_various_post_statuses 176 */ 177 function test_untrashing_a_post_should_always_restore_it_to_draft_status( $post_status ) { 178 $page_id = self::factory()->post->create( 179 array( 180 'post_type' => 'page', 181 'post_status' => $post_status, 182 ) 183 ); 184 185 wp_trash_post( $page_id ); 186 wp_untrash_post( $page_id ); 187 188 $this->assertSame( 'draft', get_post( $page_id )->post_status ); 189 } 190 191 /** 192 * @ticket 23022 193 * @dataProvider data_various_post_statuses 194 */ 195 function test_wp_untrash_post_status_filter_restores_post_to_correct_status( $post_status ) { 196 add_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 ); 197 198 $page_id = self::factory()->post->create( 199 array( 200 'post_type' => 'page', 201 'post_status' => $post_status, 202 ) 203 ); 204 205 wp_trash_post( $page_id ); 206 wp_untrash_post( $page_id ); 207 208 remove_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 ); 209 210 $this->assertSame( $post_status, get_post( $page_id )->post_status ); 211 } 212 213 /** 168 214 * Data for testing the ability for users to set the post slug. 169 215 * 170 216 * @return array Array of test arguments. … … 184 230 } 185 231 186 232 /** 233 * Data for testing post statuses. 234 * 235 * @return array Array of test arguments. 236 */ 237 function data_various_post_statuses() { 238 return array( 239 array( 240 'draft', 241 ), 242 array( 243 'pending', 244 ), 245 array( 246 'private', 247 ), 248 array( 249 'publish', 250 ), 251 ); 252 } 253 254 /** 187 255 * Test contributor making changes to the pending post slug. 188 256 * 189 257 * @ticket 42464