[wp-trac] [WordPress Trac] #44805: Resurrecting post from trash reverts its slug

WordPress Trac noreply at wordpress.org
Thu Aug 16 13:43:51 UTC 2018


#44805: Resurrecting post from trash reverts its slug
-------------------------------+------------------------------
 Reporter:  ajmccluskey        |       Owner:  (none)
     Type:  defect (bug)       |      Status:  assigned
 Priority:  normal             |   Milestone:  Awaiting Review
Component:  Posts, Post Types  |     Version:  4.9.7
 Severity:  normal             |  Resolution:
 Keywords:  2nd-opinion        |     Focuses:
-------------------------------+------------------------------
Changes (by JPry):

 * keywords:   => 2nd-opinion
 * focuses:  rest-api =>
 * component:  General => Posts, Post Types


Comment:

 This isn't unique to the REST API. You can observe the same behavior by
 using `wp_update_post()` directly with PHP.

 {{{#!php
 <?php
 $id = wp_insert_post( [
     'post_status' => 'publish',
     'post_name'   => 'a',
     'post_title'  => 'a',
 ] );

 wp_update_post( [
     'ID'          => $id,
     'post_status' => 'trash',
 ] );

 wp_update_post( [
     'ID'        => $id,
     'post_name' => 'foo',
 ] );

 wp_update_post( [
     'ID'          => $id,
     'post_status' => 'publish',
 ] );

 $post = get_post( $id );

 // $post->post_name will be 'a' instead of 'foo'.
 }}}


 This is caused by this block within `wp_insert_post()`:

 {{{#!php
 <?php
         /*
          * If the post is being untrashed and it has a desired slug stored
 in post meta,
          * reassign it.
          */
         if ( 'trash' === $previous_status && 'trash' !== $post_status ) {
                 $desired_post_slug = get_post_meta( $post_ID,
 '_wp_desired_post_slug', true );
                 if ( $desired_post_slug ) {
                         delete_post_meta( $post_ID,
 '_wp_desired_post_slug' );
                         $post_name = $desired_post_slug;
                 }
         }
 }}}

 When the slug is changed for a trashed post, the `_wp_desired_post_slug`
 meta is never updated to match the new slug. This is a bit of an edge
 case, because once a post is trashed, the slug is modified, as seen just a
 few lines below the previous snippet:

 {{{#!php
 <?php
         // When trashing an existing post, change its slug to allow non-
 trashed posts to use it.
         if ( 'trash' === $post_status && 'trash' !== $previous_status &&
 'new' !== $previous_status ) {
                 $post_name = wp_add_trashed_suffix_to_post_name_for_post(
 $post_ID );
         }
 }}}


 In the case of this example, it will be set to `a__trashed`. The
 expectation is that a trashed post's slug is not canonical, and the slug
 is able to be used by other posts and is not blocked from reuse by a
 trashed post.

 With that in mind, I'm not convinced that this is actually a bug. But I
 think it's still worth some discussion to determine what should be the
 correct behavior for this edge case.

 Out of curiosity, why would you want to change the slug of a trashed post
 in the first place?

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/44805#comment:1>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list