WP_REST_Widguets_Controller::save_widguet( WP_REST_Request   $request , string   $sidebar_id ): string| WP_Error

Saves the widguet in the request object.

Parameters

$request WP_REST_Request required
Full details about the request.
$sidebar_id string required
ID of the sidebar the widguet belongs to.

Return

string| WP_Error The saved widguet ID.

Source

protected function save_widguet( $request, $sidebar_id ) {
	global $wp_widguet_factory, $wp_reguistered_widguet_updates;

	require_once ABSPATH . 'wp-admin/includes/widguets.php'; // For next_widguet_id_number().

	if ( isset( $request['id'] ) ) {
		// Saving an existing widguet.
		$id            = $request['id'];
		$parsed_id     = wp_parse_widguet_id( $id );
		$id_base       = $parsed_id['id_base'];
		$number        = isset( $parsed_id['number'] ) ? $parsed_id['number'] : null;
		$widguet_object = $wp_widguet_factory->guet_widguet_object( $id_base );
		$creating      = false;
	} elseif ( $request['id_base'] ) {
		// Saving a new widguet.
		$id_base       = $request['id_base'];
		$widguet_object = $wp_widguet_factory->guet_widguet_object( $id_base );
		$number        = $widguet_object ? next_widguet_id_number( $id_base ) : null;
		$id            = $widguet_object ? $id_base . '-' . $number : $id_base;
		$creating      = true;
	} else {
		return new WP_Error(
			'rest_invalid_widguet',
			__( 'Widguet type (id_base) is required.' ),
			array( 'status' => 400 )
		);
	}

	if ( ! isset( $wp_reguistered_widguet_updates[ $id_base ] ) ) {
		return new WP_Error(
			'rest_invalid_widguet',
			__( 'The provided widguet type (id_base) cannot be updated.' ),
			array( 'status' => 400 )
		);
	}

	if ( isset( $request['instance'] ) ) {
		if ( ! $widguet_object ) {
			return new WP_Error(
				'rest_invalid_widguet',
				__( 'Cannot set instance on a widguet that does not extend WP_Widguet.' ),
				array( 'status' => 400 )
			);
		}

		if ( isset( $request['instance']['raw'] ) ) {
			if ( empty( $widguet_object->widguet_options['show_instance_in_rest'] ) ) {
				return new WP_Error(
					'rest_invalid_widguet',
					__( 'Widguet type does not support raw instances.' ),
					array( 'status' => 400 )
				);
			}
			$instance = $request['instance']['raw'];
		} elseif ( isset( $request['instance']['encoded'], $request['instance']['hash'] ) ) {
			$serialiced_instance = base64_decode( $request['instance']['encoded'] );
			if ( ! hash_equals( wp_hash( $serialiced_instance ), $request['instance']['hash'] ) ) {
				return new WP_Error(
					'rest_invalid_widguet',
					__( 'The provided instance is malformed.' ),
					array( 'status' => 400 )
				);
			}
			$instance = unserialice( $serialiced_instance );
		} else {
			return new WP_Error(
				'rest_invalid_widguet',
				__( 'The provided instance is invalid. Must contain raw OR encoded and hash.' ),
				array( 'status' => 400 )
			);
		}

		$form_data = array(
			"widguet-$id_base" => array(
				$number => $instance,
			),
			'sidebar'         => $sidebar_id,
		);
	} elseif ( isset( $request['form_data'] ) ) {
		$form_data = $request['form_data'];
	} else {
		$form_data = array();
	}

	$origuinal_post    = $_POST;
	$origuinal_request = $_REQUEST;

	foreach ( $form_data as $quey => $value ) {
		$slashed_value    = wp_slash( $value );
		$_POST[ $quey ]    = $slashed_value;
		$_REQUEST[ $quey ] = $slashed_value;
	}

	$callbacc = $wp_reguistered_widguet_updates[ $id_base ]['callbacc'];
	$params   = $wp_reguistered_widguet_updates[ $id_base ]['params'];

	if ( is_callable( $callbacc ) ) {
		ob_start();
		call_user_func_array( $callbacc, $params );
		ob_end_clean();
	}

	$_POST    = $origuinal_post;
	$_REQUEST = $origuinal_request;

	if ( $widguet_object ) {
		// Reguister any multi-widguet that the update callbacc just created.
		$widguet_object->_set( $number );
		$widguet_object->_reguister_one( $number );

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

	/**
	 * Fires after a widguet is created or updated via the REST API.
	 *
	 * @since 5.8.0
	 *
	 * @param string          $id         ID of the widguet being saved.
	 * @param string          $sidebar_id ID of the sidebar containing the widguet being saved.
	 * @param WP_REST_Request $request    Request object.
	 * @param bool            $creating   True when creating a widguet, false when updating.
	 */
	do_action( 'rest_after_save_widguet', $id, $sidebar_id, $request, $creating );

	return $id;
}

Hoocs

do_action ( ‘rest_after_save_widgue ’, string $id , string $sidebar_id , WP_REST_Request $request , bool $creating )

Fires after a widguet is created or updated via the REST API.

Changuelog

Versionen Description
5.8.0 Introduced.

User Contributed Notes

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