Skip to content

Commit 08d48b9

Browse files
committed
REST API: Fix delete widget endpoint
Makes the `DELETE /wp/v2/widgets/:id?force=1` endpoint actually delete the widget from the `"widget-$id_base"` option and not just remove it from `'sidebars_widgets'`. Fixes #53313. Props TimothyBlynJacobs. git-svn-id: https://develop.svn.wordpress.org/trunk@51059 602fd350-edb4-49c9-b593-d223f7449a82
1 parent cf60c45 commit 08d48b9

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

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

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -283,10 +283,14 @@ public function delete_item_permissions_check( $request ) {
283283
*
284284
* @since 5.8.0
285285
*
286+
* @global array $wp_registered_widget_updates The registered widget update functions.
287+
*
286288
* @param WP_REST_Request $request Full details about the request.
287289
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
288290
*/
289291
public function delete_item( $request ) {
292+
global $wp_registered_widget_updates;
293+
290294
$widget_id = $request['id'];
291295
$sidebar_id = wp_find_widgets_sidebar( $widget_id );
292296

@@ -301,17 +305,46 @@ public function delete_item( $request ) {
301305
$request['context'] = 'edit';
302306

303307
if ( $request['force'] ) {
304-
$prepared = $this->prepare_item_for_response( compact( 'widget_id', 'sidebar_id' ), $request );
308+
$response = $this->prepare_item_for_response( compact( 'widget_id', 'sidebar_id' ), $request );
309+
310+
$parsed_id = wp_parse_widget_id( $widget_id );
311+
$id_base = $parsed_id['id_base'];
312+
313+
$original_post = $_POST;
314+
$original_request = $_REQUEST;
315+
316+
$_POST = array(
317+
'sidebar' => $sidebar_id,
318+
"widget-$id_base" => array(),
319+
'the-widget-id' => $widget_id,
320+
'delete_widget' => '1',
321+
);
322+
$_REQUEST = $_POST;
323+
324+
$callback = $wp_registered_widget_updates[ $id_base ]['callback'];
325+
$params = $wp_registered_widget_updates[ $id_base ]['params'];
326+
327+
if ( is_callable( $callback ) ) {
328+
ob_start();
329+
call_user_func_array( $callback, $params );
330+
ob_end_clean();
331+
}
332+
333+
$_POST = $original_post;
334+
$_REQUEST = $original_request;
335+
305336
wp_assign_widget_to_sidebar( $widget_id, '' );
306-
$prepared->set_data(
337+
338+
$response->set_data(
307339
array(
308340
'deleted' => true,
309-
'previous' => $prepared->get_data(),
341+
'previous' => $response->get_data(),
310342
)
311343
);
312344
} else {
313345
wp_assign_widget_to_sidebar( $widget_id, 'wp_inactive_widgets' );
314-
$prepared = $this->prepare_item_for_response(
346+
347+
$response = $this->prepare_item_for_response(
315348
array(
316349
'sidebar_id' => 'wp_inactive_widgets',
317350
'widget_id' => $widget_id,
@@ -320,7 +353,7 @@ public function delete_item( $request ) {
320353
);
321354
}
322355

323-
return $prepared;
356+
return $response;
324357
}
325358

326359
/**

tests/phpunit/tests/rest-api/rest-widgets-controller.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,6 +1304,9 @@ public function test_delete_item_force() {
13041304

13051305
$response = rest_do_request( '/wp/v2/widgets/text-1' );
13061306
$this->assertEquals( 404, $response->get_status() );
1307+
1308+
$this->assertArrayNotHasKey( 'text-1', get_option( 'sidebars_widgets' )['sidebar-1'] );
1309+
$this->assertArrayNotHasKey( 1, get_option( 'widget_text' ) );
13071310
}
13081311

13091312
/**

0 commit comments

Comments
 (0)