Make WordPress Core

Changeset 51059


Ignore:
Timestamp:
06/02/2021 01:21:17 AM (4 years ago)
Author:
noisysocks
Message:

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.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php

    r50995 r51059  
    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 );
     
    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',
     
    321354        }
    322355
    323         return $prepared;
     356        return $response;
    324357    }
    325358
  • trunk/tests/phpunit/tests/rest-api/rest-widgets-controller.php

    r51029 r51059  
    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
Note: See TracChangeset for help on using the changeset viewer.