diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index f13d34b823..10ee07b20a 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -2405,8 +2405,9 @@ function wp_delete_post( $postid = 0, $force_delete = false ) { // Point children of this page to its parent, also clean the cache of affected children. $children_query = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_parent = %d AND post_type = %s", $postid, $post->post_type ); $children = $wpdb->get_results( $children_query ); - - $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => $post->post_type ) ); + if ( $children ) { + $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => $post->post_type ) ); + } } // Do raw query. wp_get_post_revisions() is filtered. diff --git a/tests/phpunit/tests/post.php b/tests/phpunit/tests/post.php index 025ef10c8a..6345438039 100644 --- a/tests/phpunit/tests/post.php +++ b/tests/phpunit/tests/post.php @@ -1253,4 +1253,16 @@ class Tests_Post extends WP_UnitTestCase { $this->assertEquals(get_date_from_gmt($post['post_date_gmt']), $out->post_date); $this->assertEquals($post['post_date_gmt'], $out->post_date_gmt); } + + function test_wp_delete_post_reassign_hierarchical_post_type() { + $grandparent_page_id = self::factory()->post->create( array( 'post_type' => 'page' ) ); + $parent_page_id = self::factory()->post->create( array( 'post_type' => 'page', 'post_parent' => $grandparent_page_id ) ); + $page_id = self::factory()->post->create( array( 'post_type' => 'page', 'post_parent' => $parent_page_id ) ); + $this->assertEquals( $parent_page_id, get_post( $page_id )->post_parent ); + wp_delete_post( $parent_page_id, true ); + $this->assertEquals( $grandparent_page_id, get_post( $page_id )->post_parent ); + wp_delete_post( $grandparent_page_id, true ); + $this->assertEquals( 0, get_post( $page_id )->post_parent ); + } + }