<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[49125] trunk: Posts, Post Types: Switch to restoring posts to `draft` status by default when they are untrashed.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/49125">49125</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/49125","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>johnbillion</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2020-10-11 13:37:04 +0000 (Sun, 11 Oct 2020)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Posts, Post Types: Switch to restoring posts to `draft` status by default when they are untrashed.

This allows for edits to be made to a restored post before it goes live again. This also prevents scheduled posts being published unexpectedly if they are untrashed after their originally scheduled date.

The old behaviour of restoring untrashed posts to their original status can be reinstated using the `wp_untrash_post_set_previous_status()` helper function.

Also fixes an issue where the incorrect post ID gets passed to hooks if no post ID is passed to the function.

Props harrym, bananastalktome, jaredcobb, chriscct7, melchoyce, johnbillion, pankajmohale

Fixes <a href="https://core.trac.wordpress.org/ticket/23022">#23022</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadmineditphp">trunk/src/wp-admin/edit.php</a></li>
<li><a href="#trunksrcwpadminpostphp">trunk/src/wp-admin/post.php</a></li>
<li><a href="#trunksrcwpincludesfunctionsphp">trunk/src/wp-includes/functions.php</a></li>
<li><a href="#trunksrcwpincludespostphp">trunk/src/wp-includes/post.php</a></li>
<li><a href="#trunktestsphpunittestspostwpInsertPostphp">trunk/tests/phpunit/tests/post/wpInsertPost.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadmineditphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/edit.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/edit.php       2020-10-11 02:35:32 UTC (rev 49124)
+++ trunk/src/wp-admin/edit.php 2020-10-11 13:37:04 UTC (rev 49125)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -134,6 +134,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        break;
</span><span class="cx" style="display: block; padding: 0 10px">                case 'untrash':
</span><span class="cx" style="display: block; padding: 0 10px">                        $untrashed = 0;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+                       if ( isset( $_GET['doaction'] ) && ( 'undo' === $_GET['doaction'] ) ) {
+                               add_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 );
+                       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         foreach ( (array) $post_ids as $post_id ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( ! current_user_can( 'delete_post', $post_id ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                        wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -146,6 +151,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                $untrashed++;
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px">                        $sendback = add_query_arg( 'untrashed', $untrashed, $sendback );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+                       remove_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                         break;
</span><span class="cx" style="display: block; padding: 0 10px">                case 'delete':
</span><span class="cx" style="display: block; padding: 0 10px">                        $deleted = 0;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -419,6 +427,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $ids        = preg_replace( '/[^0-9,]/', '', $_REQUEST['ids'] );
</span><span class="cx" style="display: block; padding: 0 10px">                $messages[] = '<a href="' . esc_url( wp_nonce_url( "edit.php?post_type=$post_type&doaction=undo&action=untrash&ids=$ids", 'bulk-posts' ) ) . '">' . __( 'Undo' ) . '</a>';
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       if ( 'untrashed' === $message && isset( $_REQUEST['ids'] ) ) {
+               $ids = explode( ',', $_REQUEST['ids'] );
+
+               if ( 1 === count( $ids ) && current_user_can( 'edit_post', $ids[0] ) ) {
+                       $messages[] = sprintf(
+                               '<a href="%1$s">%2$s</a>',
+                               esc_url( get_edit_post_link( $ids[0] ) ),
+                               esc_html( get_post_type_object( get_post_type( $ids[0] ) )->labels->edit_item )
+                       );
+               }
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> if ( $messages ) {
</span></span></pre></div>
<a id="trunksrcwpadminpostphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/post.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/post.php       2020-10-11 02:35:32 UTC (rev 49124)
+++ trunk/src/wp-admin/post.php 2020-10-11 13:37:04 UTC (rev 49125)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -291,7 +291,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        wp_die( __( 'Error in restoring the item from Trash.' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                wp_redirect( add_query_arg( 'untrashed', 1, $sendback ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $sendback = add_query_arg(
+                       array(
+                               'untrashed' => 1,
+                               'ids'       => $post_id,
+                       ),
+                       $sendback
+               );
+               wp_redirect( $sendback );
</ins><span class="cx" style="display: block; padding: 0 10px">                 exit;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        case 'delete':
</span></span></pre></div>
<a id="trunksrcwpincludesfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/functions.php       2020-10-11 02:35:32 UTC (rev 49124)
+++ trunk/src/wp-includes/functions.php 2020-10-11 13:37:04 UTC (rev 49125)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1193,6 +1193,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                'error',
</span><span class="cx" style="display: block; padding: 0 10px">                'hotkeys_highlight_first',
</span><span class="cx" style="display: block; padding: 0 10px">                'hotkeys_highlight_last',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                'ids',
</ins><span class="cx" style="display: block; padding: 0 10px">                 'locked',
</span><span class="cx" style="display: block; padding: 0 10px">                'message',
</span><span class="cx" style="display: block; padding: 0 10px">                'same',
</span></span></pre></div>
<a id="trunksrcwpincludespostphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/post.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/post.php    2020-10-11 02:35:32 UTC (rev 49124)
+++ trunk/src/wp-includes/post.php      2020-10-11 13:37:04 UTC (rev 49125)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3233,11 +3233,13 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Restore a post or page from the Trash.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Restores a post from the Trash.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.9.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 5.6.0 An untrashed post is now returned to 'draft' status by default, except for
+ *              attachments which are returned to their original 'inherit' status.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @param int $post_id Optional. Post ID. Default is ID of the global $post.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param int $post_id Optional. Post ID. Default is ID of the global `$post`.
</ins><span class="cx" style="display: block; padding: 0 10px">  * @return WP_Post|false|null Post data on success, false or null on failure.
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_untrash_post( $post_id = 0 ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3247,19 +3249,25 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $post;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $post_id = $post->ID;
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( 'trash' !== $post->post_status ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $previous_status = get_post_meta( $post_id, '_wp_trash_meta_status', true );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /**
</span><span class="cx" style="display: block; padding: 0 10px">         * Filters whether a post untrashing should take place.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 4.9.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @since 5.6.0 The `$previous_status` parameter was added.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param bool|null $untrash Whether to go forward with untrashing.
-        * @param WP_Post   $post    Post object.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param bool|null $untrash         Whether to go forward with untrashing.
+        * @param WP_Post   $post            Post object.
+        * @param string    $previous_status The status of the post at the point where it was trashed.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $check = apply_filters( 'pre_untrash_post', null, $post );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $check = apply_filters( 'pre_untrash_post', null, $post, $previous_status );
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( null !== $check ) {
</span><span class="cx" style="display: block; padding: 0 10px">                return $check;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3268,13 +3276,32 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * Fires before a post is restored from the Trash.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 2.9.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @since 5.6.0 The `$previous_status` parameter was added.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param int $post_id Post ID.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param int    $post_id         Post ID.
+        * @param string $previous_status The status of the post at the point where it was trashed.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        do_action( 'untrash_post', $post_id );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ do_action( 'untrash_post', $post_id, $previous_status );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $post_status = get_post_meta( $post_id, '_wp_trash_meta_status', true );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $new_status = ( 'attachment' === $post->post_type ) ? 'inherit' : 'draft';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Filters the status that a post gets assigned when it is restored from the trash (untrashed).
+        *
+        * By default posts that are restored will be assigned a status of 'draft'. Return the value of `$previous_status`
+        * in order to assign the status that the post had before it was trashed. The `wp_untrash_post_set_previous_status()`
+        * function is available for this.
+        *
+        * Prior to WordPress 5.6.0, restored posts were always assigned their original status.
+        *
+        * @since 5.6.0
+        *
+        * @param string $new_status      The new status of the post being restored.
+        * @param int    $post_id         The ID of the post being restored.
+        * @param string $previous_status The status of the post at the point where it was trashed.
+        */
+       $post_status = apply_filters( 'wp_untrash_post_status', $new_status, $post_id, $previous_status );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         delete_post_meta( $post_id, '_wp_trash_meta_status' );
</span><span class="cx" style="display: block; padding: 0 10px">        delete_post_meta( $post_id, '_wp_trash_meta_time' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3295,10 +3322,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * Fires after a post is restored from the Trash.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 2.9.0
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @since 5.6.0 The `$previous_status` parameter was added.
</ins><span class="cx" style="display: block; padding: 0 10px">          *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param int $post_id Post ID.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param int    $post_id         Post ID.
+        * @param string $previous_status The status of the post at the point where it was trashed.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        do_action( 'untrashed_post', $post_id );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ do_action( 'untrashed_post', $post_id, $previous_status );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        return $post;
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -7513,3 +7542,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        return apply_filters( 'wp_get_original_image_url', $original_image_url, $attachment_id );
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+/**
+ * Filter callback which sets the status of an untrashed post to its previous status.
+ *
+ * This can be used as a callback on the `wp_untrash_post_status` filter.
+ *
+ * @since 5.6.0
+ *
+ * @param string $new_status      The new status of the post being restored.
+ * @param int    $post_id         The ID of the post being restored.
+ * @param string $previous_status The status of the post at the point where it was trashed.
+ * @return string The new status of the post.
+ */
+function wp_untrash_post_set_previous_status( $new_status, $post_id, $previous_status ) {
+       return $previous_status;
+}
</ins></span></pre></div>
<a id="trunktestsphpunittestspostwpInsertPostphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/post/wpInsertPost.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/post/wpInsertPost.php   2020-10-11 02:35:32 UTC (rev 49124)
+++ trunk/tests/phpunit/tests/post/wpInsertPost.php     2020-10-11 13:37:04 UTC (rev 49125)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -159,6 +159,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                wp_untrash_post( $about_page_id );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                wp_update_post(
+                       array(
+                               'ID'          => $about_page_id,
+                               'post_status' => 'publish',
+                       )
+               );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( 'about', get_post( $another_about_page_id )->post_name );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertSame( 'about-2', get_post( $about_page_id )->post_name );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -165,6 +171,46 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * @ticket 23022
+        * @dataProvider data_various_post_statuses
+        */
+       function test_untrashing_a_post_should_always_restore_it_to_draft_status( $post_status ) {
+               $page_id = self::factory()->post->create(
+                       array(
+                               'post_type'   => 'page',
+                               'post_status' => $post_status,
+                       )
+               );
+
+               wp_trash_post( $page_id );
+               wp_untrash_post( $page_id );
+
+               $this->assertSame( 'draft', get_post( $page_id )->post_status );
+       }
+
+       /**
+        * @ticket 23022
+        * @dataProvider data_various_post_statuses
+        */
+       function test_wp_untrash_post_status_filter_restores_post_to_correct_status( $post_status ) {
+               add_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 );
+
+               $page_id = self::factory()->post->create(
+                       array(
+                               'post_type'   => 'page',
+                               'post_status' => $post_status,
+                       )
+               );
+
+               wp_trash_post( $page_id );
+               wp_untrash_post( $page_id );
+
+               remove_filter( 'wp_untrash_post_status', 'wp_untrash_post_set_previous_status', 10, 3 );
+
+               $this->assertSame( $post_status, get_post( $page_id )->post_status );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Data for testing the ability for users to set the post slug.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @return array Array of test arguments.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -184,6 +230,28 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * Data for testing post statuses.
+        *
+        * @return array Array of test arguments.
+        */
+       function data_various_post_statuses() {
+               return array(
+                       array(
+                               'draft',
+                       ),
+                       array(
+                               'pending',
+                       ),
+                       array(
+                               'private',
+                       ),
+                       array(
+                               'publish',
+                       ),
+               );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Test contributor making changes to the pending post slug.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @ticket 42464
</span></span></pre>
</div>
</div>

</body>
</html>