Make WordPress Core

Ticket #23022: 23022.2.diff

File 23022.2.diff, 8.7 KB (added by johnbillion, 4 years ago)
  • src/wp-admin/edit.php

     
    134134                        break;
    135135                case 'untrash':
    136136                        $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
    137142                        foreach ( (array) $post_ids as $post_id ) {
    138143                                if ( ! current_user_can( 'delete_post', $post_id ) ) {
    139144                                        wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) );
     
    146151                                $untrashed++;
    147152                        }
    148153                        $sendback = add_query_arg( 'untrashed', $untrashed, $sendback );
     154
     155                        remove_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 );
     156
    149157                        break;
    150158                case 'delete':
    151159                        $deleted = 0;
     
    419427                $ids        = preg_replace( '/[^0-9,]/', '', $_REQUEST['ids'] );
    420428                $messages[] = '<a href="' . esc_url( wp_nonce_url( "edit.php?post_type=$post_type&doaction=undo&action=untrash&ids=$ids", 'bulk-posts' ) ) . '">' . __( 'Undo' ) . '</a>';
    421429        }
     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        }
    422442}
    423443
    424444if ( $messages ) {
  • src/wp-admin/post.php

     
    291291                        wp_die( __( 'Error in restoring the item from Trash.' ) );
    292292                }
    293293
    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 );
    295302                exit;
    296303
    297304        case 'delete':
  • src/wp-includes/functions.php

     
    11931193                'error',
    11941194                'hotkeys_highlight_first',
    11951195                'hotkeys_highlight_last',
     1196                'ids',
    11961197                'locked',
    11971198                'message',
    11981199                'same',
  • src/wp-includes/post.php

     
    32333233}
    32343234
    32353235/**
    3236  * Restore a post or page from the Trash.
     3236 * Restores a post from the Trash.
    32373237 *
    32383238 * @since 2.9.0
     3239 * @since 5.6.0 An untrashed post is now returned to `draft` status by default.
    32393240 *
    32403241 * @param int $post_id Optional. Post ID. Default is ID of the global $post.
    32413242 * @return WP_Post|false|null Post data on success, false or null on failure.
     
    32473248                return $post;
    32483249        }
    32493250
     3251        $post_id = $post->ID;
     3252
    32503253        if ( 'trash' !== $post->post_status ) {
    32513254                return false;
    32523255        }
    32533256
     3257        $previous_status = get_post_meta( $post_id, '_wp_trash_meta_status', true );
     3258
    32543259        /**
    32553260         * Filters whether a post untrashing should take place.
    32563261         *
    32573262         * @since 4.9.0
     3263         * @since 5.6.0 The `$previous_status` parameter was added.
    32583264         *
    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.
    32613268         */
    3262         $check = apply_filters( 'pre_untrash_post', null, $post );
     3269        $check = apply_filters( 'pre_untrash_post', null, $post, $previous_status );
    32633270        if ( null !== $check ) {
    32643271                return $check;
    32653272        }
     
    32683275         * Fires before a post is restored from the Trash.
    32693276         *
    32703277         * @since 2.9.0
     3278         * @since 5.6.0 The `$previous_status` parameter was added.
    32713279         *
    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.
    32733282         */
    3274         do_action( 'untrash_post', $post_id );
     3283        do_action( 'untrash_post', $post_id, $previous_status );
    32753284
    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 );
    32773303
    32783304        delete_post_meta( $post_id, '_wp_trash_meta_status' );
    32793305        delete_post_meta( $post_id, '_wp_trash_meta_time' );
     
    32953321         * Fires after a post is restored from the Trash.
    32963322         *
    32973323         * @since 2.9.0
     3324         * @since 5.6.0 The `$previous_status` parameter was added.
    32983325         *
    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.
    33003328         */
    3301         do_action( 'untrashed_post', $post_id );
     3329        do_action( 'untrashed_post', $post_id, $previous_status );
    33023330
    33033331        return $post;
    33043332}
     
    75137541         */
    75147542        return apply_filters( 'wp_get_original_image_url', $original_image_url, $attachment_id );
    75157543}
     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 */
     7557function wp_untrash_post_set_previous_status( $new_status, $post_id, $previous_status ) {
     7558        return $previous_status;
     7559}
  • tests/phpunit/tests/post/wpInsertPost.php

     
    159159                );
    160160
    161161                wp_untrash_post( $about_page_id );
     162                wp_update_post(
     163                        array(
     164                                'ID'          => $about_page_id,
     165                                'post_status' => 'publish',
     166                        )
     167                );
    162168
    163169                $this->assertSame( 'about', get_post( $another_about_page_id )->post_name );
    164170                $this->assertSame( 'about-2', get_post( $about_page_id )->post_name );
    165171        }
    166172
    167173        /**
     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        /**
    168214         * Data for testing the ability for users to set the post slug.
    169215         *
    170216         * @return array Array of test arguments.
     
    184230        }
    185231
    186232        /**
     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        /**
    187255         * Test contributor making changes to the pending post slug.
    188256         *
    189257         * @ticket 42464