[wp-trac] [WordPress Trac] #61996: Slug Conflict When a Published and Draft Page Share post_name

WordPress Trac noreply at wordpress.org
Fri Sep 6 05:05:59 UTC 2024


#61996: Slug Conflict When a Published and Draft Page Share post_name
-------------------------------+-----------------------------
 Reporter:  brookedot          |      Owner:  (none)
     Type:  defect (bug)       |     Status:  new
 Priority:  normal             |  Milestone:  Awaiting Review
Component:  Posts, Post Types  |    Version:
 Severity:  normal             |   Keywords:
  Focuses:                     |
-------------------------------+-----------------------------
 It is possible (although it takes some work) to have a published page and
 a draft page that shares the same `post_name`. When this occurs if the
 **draft page** has a lower ID then it is retrieved by `get_page_by_path`
 in place of the **published page**. This is due at least in part to
 `get_page_by_path` [https://core.trac.wordpress.org/ticket/17361#comment:1
 not checking the page status] and .


 1. Ensure permalinks are anything other than `Plain`
 2. Publish three nested pages, the first page here is needed to avoid a
 slug conflict when you later create pages with the same name. For example,
 to prevent `parent` from becoming `parent-2`. The posts must be published
 so they can be selected as parent pages. Consider setting the page content
 to "this is draft" so it's easy to tell these apart later.
 - Placeholder (slug `placeholder`)
   - Parent  (slug `/placehoder/parent`
    - Child ( slug `placeholder/parent/child`

 3. Using the Bulk Action, set all three newly created published posts to
 draft. There may be other ways to do this, as well.


 4. Publish two addition new pages with the same slugs as `parent` and
 `child`
 - Parent ( slug `parent` )
  - Child (slug `parent/child`)

 5. Using Quick Edit remove the parent from the draft page `parent` (
 `/placeholder/parent`) by setting its parent page to `Main (no parent)
 keeping it as a draft.

 You should now have `parent` and `parent/child` as drafts alongside your
 other two published pages.


 6. Ensure you don't have a `-2` in either `parent-2` or `child-2`

 7. If all goes well, when you visit `parent/child` you will now see a 404
 instead of the pages you published in step 4.

 There is a screen recording of these steps here:
 https://cloudup.com/cxkwjscxDfB

 They can be replicated in Multisite, Single site, and WordPress
 playground.

 Some insight into what is happening is when you return the array used to
 `get_page_by_path`. For WordPress 6.6.1 that is
 https://github.com/WordPress/WordPress/blob/6.6.1/wp-
 includes/post.php#L5881

 Using `var_dump` to return the array:
 {{{#!php
 <?php
         $sql                 = "
                 SELECT ID, post_name, post_parent, post_type
                 FROM $wpdb->posts
                 WHERE post_name IN ($in_string)
                 AND post_type IN ($post_type_in_string)
         ";

         $pages = $wpdb->get_results( $sql, ARRAY_A );

         $revparts = array_reverse( $parts );
         var_dump( $pages );
 }}}

 This returns post ID 63 first which is our draft `child` page thus a 404
 on the front end. ID `69` is the published `child` page which is never
 displayed on the front end as ID 63 is returned first.

 Here is the output of the above `var_dump()`

 {{{#!php
 <?php
 array (size=4)
   0 =>
     array (size=4)
       'ID' => string '63' (length=2)
       'post_name' => string 'child' (length=5)
       'post_parent' => string '61' (length=2)
       'post_type' => string 'page' (length=4)
   1 =>
     array (size=4)
       'ID' => string '69' (length=2)
       'post_name' => string 'child' (length=5)
       'post_parent' => string '65' (length=2)
       'post_type' => string 'page' (length=4)
   2 =>
     array (size=4)
       'ID' => string '61' (length=2)
       'post_name' => string 'parent' (length=6)
       'post_parent' => string '0' (length=1)
       'post_type' => string 'page' (length=4)
   3 =>
     array (size=4)
       'ID' => string '65' (length=2)
       'post_name' => string 'parent' (length=6)
       'post_parent' => string '0' (length=1)
       'post_type' => string 'page' (length=4)

 }}}

 A few other related trac issues were found but nothing that matched this
 exactly. Please update the Component to match the closest, I almost set
 this as `permalinks`

 Related to #13459 (but not a duplicate as this is the same post type)

 Props @trepmal who was instrumental in debugging and reporting this bug.

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/61996>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list