Skip to content

Commit cee5f71

Browse files
authored
Merge pull request #3 from spacedmonkey/feature/40365-rest-sites-endpoint-force-delete
Enhance site deletion process to support force deletion and user removal
2 parents 829c066 + 1a4ddf8 commit cee5f71

2 files changed

Lines changed: 50 additions & 18 deletions

File tree

‎src/wp-includes/rest-api/endpoints/class-wp-rest-sites-controller.php‎

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public function register_routes() {
100100
'force' => array(
101101
'type' => 'boolean',
102102
'default' => false,
103-
'description' => __( 'Required to be true, as sites do not support trashing.' ),
103+
'description' => __( 'Whether to set site to deleted and force deletion.' ),
104104
),
105105
),
106106
),
@@ -694,24 +694,15 @@ public function delete_item_permissions_check( $request ) {
694694
* @return WP_Error|WP_REST_Response Response object on success, or error object on failure.
695695
*/
696696
public function delete_item( $request ) {
697-
$site = $this->get_site( $request['id'] );
697+
$blog_id = (int) $request['id'];
698+
$site = $this->get_site( $blog_id );
698699
if ( is_wp_error( $site ) ) {
699700
return $site;
700701
}
701702

702-
if ( ! (bool) $request['force'] ) {
703-
return new WP_Error(
704-
'rest_trash_not_supported',
705-
/* translators: %s: force=true */
706-
sprintf( __( "Sites do not support trashing. Set '%s' to delete." ), 'force=true' ),
707-
array( 'status' => 501 )
708-
);
709-
}
710-
711703
$request->set_param( 'context', 'edit' );
712704

713705
$previous = $this->prepare_item_for_response( $site, $request );
714-
$result = wp_delete_site( $request['id'] );
715706

716707
$response = new WP_REST_Response();
717708
$response->set_data(
@@ -721,10 +712,36 @@ public function delete_item( $request ) {
721712
)
722713
);
723714

724-
if ( is_wp_error( $result ) ) {
725-
$result->add_data( array( 'status' => 500 ) );
715+
if ( ! (bool) $request['force'] ) {
716+
/** This action is documented in wp-includes/ms-site.php */
717+
do_action_deprecated( 'delete_blog', array( $blog_id, false ), '5.1.0' );
726718

727-
return $result;
719+
$users = get_users(
720+
array(
721+
'blog_id' => $blog_id,
722+
'fields' => 'ids',
723+
)
724+
);
725+
726+
// Remove users from this blog.
727+
if ( ! empty( $users ) ) {
728+
foreach ( $users as $user_id ) {
729+
remove_user_from_blog( $user_id, $blog_id );
730+
}
731+
}
732+
733+
update_blog_status( $blog_id, 'deleted', 1 );
734+
735+
/** This action is documented in wp-includes/ms-site.php */
736+
do_action_deprecated( 'deleted_blog', array( $blog_id, false ), '5.1.0' );
737+
} else {
738+
739+
$result = wp_delete_site( $request['id'] );
740+
if ( is_wp_error( $result ) ) {
741+
$result->add_data( array( 'status' => 500 ) );
742+
743+
return $result;
744+
}
728745
}
729746

730747
/**

‎tests/phpunit/tests/rest-api/wpRestSitesController.php‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,8 @@ public function test_delete_item_uninitializes_the_site() {
306306
}
307307

308308
/**
309-
* Sites have no trash, so deleting has to be explicit.
309+
* Deleting without force marks the site as deleted and removes its users,
310+
* but does not drop the site.
310311
*
311312
* @ticket 40365
312313
* @covers ::delete_item
@@ -316,12 +317,26 @@ public function test_delete_item_requires_force() {
316317
wp_set_current_user( self::$superadmin_id );
317318

318319
$blog_id = self::factory()->blog->create( array( 'path' => '/consectetur/' ) );
320+
$user_id = self::factory()->user->create();
321+
add_user_to_blog( $blog_id, $user_id, 'author' );
322+
323+
$this->assertTrue( is_user_member_of_blog( $user_id, $blog_id ) );
319324

320325
$request = new WP_REST_Request( 'DELETE', '/wp/v2/sites/' . $blog_id );
321326
$response = rest_get_server()->dispatch( $request );
322327

323-
$this->assertErrorResponse( 'rest_trash_not_supported', $response, 501 );
324-
$this->assertNotNull( get_site( $blog_id ) );
328+
$this->assertEquals( 200, $response->get_status() );
329+
330+
$data = $response->get_data();
331+
$this->assertTrue( $data['deleted'] );
332+
333+
// The site still exists but is flagged as deleted.
334+
$site = get_site( $blog_id );
335+
$this->assertNotNull( $site );
336+
$this->assertEquals( '1', $site->deleted );
337+
338+
// Its users have been removed from the blog.
339+
$this->assertFalse( is_user_member_of_blog( $user_id, $blog_id ) );
325340
}
326341

327342
/**

0 commit comments

Comments
 (0)