WP_REST_Widgets_Controller::save_widget() – Saves the widget in the request object.

You appear to be a bot. Output may be restricted

Description

Saves the widget in the request object.

Usage

$string|WP_Error = WP_REST_Widgets_Controller::save_widget( $request, $sidebar_id );

Parameters

$request
( WP_REST_Request ) required – Full details about the request.
$sidebar_id
( string ) required – ID of the sidebar the widget belongs to.

Returns

string|WP_Error The saved widget ID.

Source

File name: wordpress/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php
Lines:

1 to 100 of 132
  protected function save_widget( $request, $sidebar_id ) {
    global $wp_widget_factory, $wp_registered_widget_updates;

    require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number().

    if ( isset( $request['id'] ) ) {
      // Saving an existing widget.
      $id            = $request['id'];
      $parsed_id     = wp_parse_widget_id( $id );
      $id_base       = $parsed_id['id_base'];
      $number        = isset( $parsed_id['number'] ) ? $parsed_id['number'] : null;
      $widget_object = $wp_widget_factory->get_widget_object( $id_base );
      $creating      = false;
    } elseif ( $request['id_base'] ) {
      // Saving a new widget.
      $id_base       = $request['id_base'];
      $widget_object = $wp_widget_factory->get_widget_object( $id_base );
      $number        = $widget_object ? next_widget_id_number( $id_base ) : null;
      $id            = $widget_object ? $id_base . '-' . $number : $id_base;
      $creating      = true;
    } else {
      return new WP_Error(
        'rest_invalid_widget',
        __( 'Widget type (id_base) is required.' ),
        array( 'status' => 400 )
      );
    }

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

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

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

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

    $original_post    = $_POST;
    $original_request = $_REQUEST;

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

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

 View on GitHub View on Trac