REST API: Delete fresh_site option when updating widgets via REST API

Adds new hooks (rest_save_sidebar, rest_delete_widget, rest_after_save_widget)
to the widgets REST API and uses them to delete the fresh_site option when
updating widgets via the REST API. This ensures that starter content isn't
loaded in the Customizer after a user makes changes.

Fixes #53317.
Props kevin940726, garrett-eclipse, andraganescu, hellofromtonya.

Built from https://develop.svn.wordpress.org/trunk@51068


git-svn-id: http://core.svn.wordpress.org/trunk@50677 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
noisysocks 2021-06-04 00:45:56 +00:00
parent 6531090038
commit 222541d7c3
4 changed files with 51 additions and 6 deletions

View File

@ -246,7 +246,18 @@ add_filter( 'wp_robots', 'wp_robots_noindex_search' );
add_filter( 'wp_robots', 'wp_robots_max_image_preview_large' ); add_filter( 'wp_robots', 'wp_robots_max_image_preview_large' );
// Mark site as no longer fresh. // Mark site as no longer fresh.
foreach ( array( 'publish_post', 'publish_page', 'wp_ajax_save-widget', 'wp_ajax_widgets-order', 'customize_save_after' ) as $action ) { foreach (
array(
'publish_post',
'publish_page',
'wp_ajax_save-widget',
'wp_ajax_widgets-order',
'customize_save_after',
'rest_after_save_widget',
'rest_delete_widget',
'rest_save_sidebar',
) as $action
) {
add_action( $action, '_delete_option_fresh_site', 0 ); add_action( $action, '_delete_option_fresh_site', 0 );
} }

View File

@ -209,6 +209,15 @@ class WP_REST_Sidebars_Controller extends WP_REST_Controller {
$sidebar = $this->get_sidebar( $request['id'] ); $sidebar = $this->get_sidebar( $request['id'] );
/**
* Fires after a sidebar is updated via the REST API.
*
* @since 5.8.0
* @param array $sidebar The updated sidebar.
* @param WP_REST_Request $request Request object.
*/
do_action( 'rest_save_sidebar', $sidebar, $request );
return $this->prepare_item_for_response( $sidebar, $request ); return $this->prepare_item_for_response( $sidebar, $request );
} }

View File

@ -186,7 +186,7 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
public function create_item( $request ) { public function create_item( $request ) {
$sidebar_id = $request['sidebar']; $sidebar_id = $request['sidebar'];
$widget_id = $this->save_widget( $request ); $widget_id = $this->save_widget( $request, $sidebar_id );
if ( is_wp_error( $widget_id ) ) { if ( is_wp_error( $widget_id ) ) {
return $widget_id; return $widget_id;
@ -248,7 +248,7 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
$request->has_param( 'instance' ) || $request->has_param( 'instance' ) ||
$request->has_param( 'form_data' ) $request->has_param( 'form_data' )
) { ) {
$maybe_error = $this->save_widget( $request ); $maybe_error = $this->save_widget( $request, $sidebar_id );
if ( is_wp_error( $maybe_error ) ) { if ( is_wp_error( $maybe_error ) ) {
return $maybe_error; return $maybe_error;
} }
@ -356,6 +356,17 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
); );
} }
/**
* 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 $response The response data.
* @param WP_REST_Request $request The request sent to the API.
*/
do_action( 'rest_delete_widget', $widget_id, $sidebar_id, $response, $request );
return $response; return $response;
} }
@ -386,10 +397,11 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
* @since 5.8.0 * @since 5.8.0
* *
* @param WP_REST_Request $request Full details about the request. * @param WP_REST_Request $request Full details about the request.
* @param string $sidebar_id ID of the sidebar the widget belongs to.
* *
* @return string|WP_Error The saved widget ID. * @return string|WP_Error The saved widget ID.
*/ */
protected function save_widget( $request ) { protected function save_widget( $request, $sidebar_id ) {
global $wp_widget_factory, $wp_registered_widget_updates; global $wp_widget_factory, $wp_registered_widget_updates;
require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number(). require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number().
@ -401,12 +413,14 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
$id_base = $parsed_id['id_base']; $id_base = $parsed_id['id_base'];
$number = isset( $parsed_id['number'] ) ? $parsed_id['number'] : null; $number = isset( $parsed_id['number'] ) ? $parsed_id['number'] : null;
$widget_object = $wp_widget_factory->get_widget_object( $id_base ); $widget_object = $wp_widget_factory->get_widget_object( $id_base );
$creating = false;
} elseif ( $request['id_base'] ) { } elseif ( $request['id_base'] ) {
// Saving a new widget. // Saving a new widget.
$id_base = $request['id_base']; $id_base = $request['id_base'];
$widget_object = $wp_widget_factory->get_widget_object( $id_base ); $widget_object = $wp_widget_factory->get_widget_object( $id_base );
$number = $widget_object ? next_widget_id_number( $id_base ) : null; $number = $widget_object ? next_widget_id_number( $id_base ) : null;
$id = $widget_object ? $id_base . '-' . $number : $id_base; $id = $widget_object ? $id_base . '-' . $number : $id_base;
$creating = true;
} else { } else {
return new WP_Error( return new WP_Error(
'rest_invalid_widget', 'rest_invalid_widget',
@ -502,6 +516,17 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
$widget_object->updated = false; $widget_object->updated = false;
} }
/**
* Fires after a widget is created or updated via the REST API.
*
* @since 5.8.0
* @param string $id ID of the widget being saved.
* @param string $sidebar_id ID of the sidebar containing the widget being saved.
* @param WP_REST_Request $request Request object.
* @param bool $creating True when creating a widget, false when updating.
*/
do_action( 'rest_after_save_widget', $id, $sidebar_id, $request, $creating );
return $id; return $id;
} }

View File

@ -13,7 +13,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '5.8-alpha-51067'; $wp_version = '5.8-alpha-51068';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.