WP_REST_Widgets_Controller::delete_item( WP_REST_Request $request ): WP_REST_Response|WP_Error

In this article

Deletes a widget.

Parameters

$requestWP_REST_Requestrequired
Full details about the request.

Return

WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.

Source

public function delete_item( $request ) {
	global $wp_widget_factory, $wp_registered_widget_updates;

	/*
	 * retrieve_widgets() contains logic to move "hidden" or "lost" widgets to the
	 * wp_inactive_widgets sidebar based on the contents of the $sidebars_widgets global.
	 *
	 * When batch requests are processed, this global is not properly updated by previous
	 * calls, resulting in widgets incorrectly being moved to the wp_inactive_widgets
	 * sidebar.
	 *
	 * See https://core.trac.wordpress.org/ticket/53657.
	 */
	wp_get_sidebars_widgets();
	$this->retrieve_widgets();

	$widget_id  = $request['id'];
	$sidebar_id = wp_find_widgets_sidebar( $widget_id );

	if ( is_null( $sidebar_id ) ) {
		return new WP_Error(
			'rest_widget_not_found',
			__( 'No widget was found with that id.' ),
			array( 'status' => 404 )
		);
	}

	$request['context'] = 'edit';

	if ( $request['force'] ) {
		$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;

		/** This action is documented in wp-admin/widgets-form.php */
		do_action( 'delete_widget', $widget_id, $sidebar_id, $id_base );

		$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;

		$widget_object = $wp_widget_factory->get_widget_object( $id_base );

		if ( $widget_object ) {
			/*
			 * WP_Widget sets `updated = true` after an update to prevent more than one widget
			 * from being saved per request. This isn't what we want in the REST API, though,
			 * as we support batch requests.
			 */
			$widget_object->updated = false;
		}

		wp_assign_widget_to_sidebar( $widget_id, '' );

		$response->set_data(
			array(
				'deleted'  => true,
				'previous' => $response->get_data(),
			)
		);
	} else {
		wp_assign_widget_to_sidebar( $widget_id, 'wp_inactive_widgets' );

		$response = $this->prepare_item_for_response(
			array(
				'sidebar_id' => 'wp_inactive_widgets',
				'widget_id'  => $widget_id,
			),
			$request
		);
	}

	/**
	 * Fires after a widget is deleted via the REST API.
	 *
	 * @since 5.8.0
	 *
	 * @param string                    $widget_id  ID of the widget marked for deletion.
	 * @param string                    $sidebar_id ID of the sidebar the widget was deleted from.
	 * @param WP_REST_Response|WP_Error $response   The response data, or WP_Error object on failure.
	 * @param WP_REST_Request           $request    The request sent to the API.
	 */
	do_action( 'rest_delete_widget', $widget_id, $sidebar_id, $response, $request );

	return $response;
}

Hooks

do_action( ‘delete_widget’, string $widget_id, string $sidebar_id, string $id_base )

Fires immediately after a widget has been marked for deletion.

do_action( ‘rest_delete_widget’, string $widget_id, string $sidebar_id, WP_REST_Response|WP_Error $response, WP_REST_Request $request )

Fires after a widget is deleted via the REST API.

Changelog

VersionDescription
5.8.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.