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
This commit is contained in:
Robert Anderson 2021-06-02 01:21:17 +00:00
parent cf60c451b0
commit 08d48b9e21
2 changed files with 41 additions and 5 deletions

View File

@ -283,10 +283,14 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
*
* @since 5.8.0
*
* @global array $wp_registered_widget_updates The registered widget update functions.
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
*/
public function delete_item( $request ) {
global $wp_registered_widget_updates;
$widget_id = $request['id'];
$sidebar_id = wp_find_widgets_sidebar( $widget_id );
@ -301,17 +305,46 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
$request['context'] = 'edit';
if ( $request['force'] ) {
$prepared = $this->prepare_item_for_response( compact( 'widget_id', 'sidebar_id' ), $request );
$response = $this->prepare_item_for_response( compact( 'widget_id', 'sidebar_id' ), $request );
$parsed_id = wp_parse_widget_id( $widget_id );
$id_base = $parsed_id['id_base'];
$original_post = $_POST;
$original_request = $_REQUEST;
$_POST = array(
'sidebar' => $sidebar_id,
"widget-$id_base" => array(),
'the-widget-id' => $widget_id,
'delete_widget' => '1',
);
$_REQUEST = $_POST;
$callback = $wp_registered_widget_updates[ $id_base ]['callback'];
$params = $wp_registered_widget_updates[ $id_base ]['params'];
if ( is_callable( $callback ) ) {
ob_start();
call_user_func_array( $callback, $params );
ob_end_clean();
}
$_POST = $original_post;
$_REQUEST = $original_request;
wp_assign_widget_to_sidebar( $widget_id, '' );
$prepared->set_data(
$response->set_data(
array(
'deleted' => true,
'previous' => $prepared->get_data(),
'previous' => $response->get_data(),
)
);
} else {
wp_assign_widget_to_sidebar( $widget_id, 'wp_inactive_widgets' );
$prepared = $this->prepare_item_for_response(
$response = $this->prepare_item_for_response(
array(
'sidebar_id' => 'wp_inactive_widgets',
'widget_id' => $widget_id,
@ -320,7 +353,7 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
);
}
return $prepared;
return $response;
}
/**

View File

@ -1304,6 +1304,9 @@ class WP_Test_REST_Widgets_Controller extends WP_Test_REST_Controller_Testcase {
$response = rest_do_request( '/wp/v2/widgets/text-1' );
$this->assertEquals( 404, $response->get_status() );
$this->assertArrayNotHasKey( 'text-1', get_option( 'sidebars_widgets' )['sidebar-1'] );
$this->assertArrayNotHasKey( 1, get_option( 'widget_text' ) );
}
/**