Opened 7 years ago
Last modified 6 months ago
#47552 new defect (bug)
post_name when inserting is not guaranteed to be unique
| Reported by: |
|
Owned by: | |
|---|---|---|---|
| Milestone: | Future Release | Priority: | normal |
| Severity: | normal | Version: | |
| Component: | Posts, Post Types | Keywords: | has-test-info needs-patch needs-unit-tests |
| Focuses: | Cc: |
Description
Hi all,
In wp_insert_post, there is a gap between the allocation of the post_name (as wp_unique_post_slug), and the insertion ($wpdb->insert) of the post. This is problematic because another WordPress instance can insert a post with the same post_name in this gap, which would result in two posts being inserted with the same post name
See here for an example: https://github.com/domsleee/wp_insert_post_duplicate
I suppose a solution may be to obtain a table lock, then find a unique slug and insert the post, and then release the table lock... but this doesn't seem very performant. What do you guys think?
Attachments (2)
Change History (5)
#3
in reply to:
↑ 2
@
6 months ago
- Keywords has-test-info needs-patch needs-unit-tests added
- Milestone changed from Awaiting Review to Future Release
Reproduction Report
Description
✅ This report validates whether the issue can be reproduced.
Environment
- WordPress: 6.9-alpha-60093-src
- PHP: 8.2.29
- Server: nginx/1.29.1
- Database: mysqli (Server: 8.4.6 / Client: mysqlnd 8.2.29)
- Browser: Chrome 140.0.0.0
- OS: Windows 10/11
- Theme: Twenty Twenty-Five 1.3
- MU Plugins: None activated
- Plugins:
- BBB Testing Dolly
- Test Reports 1.2.0
Testing Instructions
- If running
wordpress-developyou will need a couple tweaks and thewpdev-docker-imagesWordPress repo. Check these two patches (wpdev-docker-images patch and docker compose patch to set everything up. - Add the plugin in the OP
- Run with WP CLI
cli wp my_plugin - 🐞 Two posts are created with the exact same
post_name
Actual Results
- ✅ Error condition occurs (reproduced).
Additional Information
Replying to domslee:
Should we consider a UNIQUE constraint on (post_name, post_type, post_status)?
There could be matching names as long as they are hierarchically in different levels. So we could have two post_type = page, two post_status = publish and two post_name identical. At best this could be done only if post_type = post (or for non hierarchical post types). But definitely not as a SQL UNIQUE key. I think that this specific casuistry is what brings all this havoc with many reports having this trouble.
To test this I've added two files, one to add for a php 8.2 image in wpdev-docker-images and little tweak for the current docker-compose.yml to run the semaphores. Main problem here is that the default images are not well prepared to run scripts with extra libraries. I've added these two files, in case I have to refer back to this ticket, and I'm able to test this without having to spend the time I have spent to learn how to set up this in the wordpress-develop environment`.
So finally, after some testing and reviewing of this, I can confirm that the possibility to do this is there.
I'm unsure if #61996 is related because happens the same, but in page type, and playing around with parent-child relationships (i mean real WP parental relationship, not thread relationships like in the CLI plugin). Also this is being tricker to test, because since its running under wp-cli conditions, I'm unable to run with xdebug to clearly see the order of the operations in wp_insert_post
Definitely not an easy patch here at first glance. I would like to hear more opinions. @peterwilsoncc can you take a look at this when you have a minute?
Should we consider a UNIQUE constraint on (post_name, post_type, post_status)?