Skip to content

Commit efd163e

Browse files
committed
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. git-svn-id: https://develop.svn.wordpress.org/trunk@51068 602fd350-edb4-49c9-b593-d223f7449a82
1 parent e46ffeb commit efd163e

File tree

3 files changed

+50
-5
lines changed

3 files changed

+50
-5
lines changed

src/wp-includes/default-filters.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,18 @@
246246
add_filter( 'wp_robots', 'wp_robots_max_image_preview_large' );
247247

248248
// Mark site as no longer fresh.
249-
foreach ( array( 'publish_post', 'publish_page', 'wp_ajax_save-widget', 'wp_ajax_widgets-order', 'customize_save_after' ) as $action ) {
249+
foreach (
250+
array(
251+
'publish_post',
252+
'publish_page',
253+
'wp_ajax_save-widget',
254+
'wp_ajax_widgets-order',
255+
'customize_save_after',
256+
'rest_after_save_widget',
257+
'rest_delete_widget',
258+
'rest_save_sidebar',
259+
) as $action
260+
) {
250261
add_action( $action, '_delete_option_fresh_site', 0 );
251262
}
252263

src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,15 @@ public function update_item( $request ) {
209209

210210
$sidebar = $this->get_sidebar( $request['id'] );
211211

212+
/**
213+
* Fires after a sidebar is updated via the REST API.
214+
*
215+
* @since 5.8.0
216+
* @param array $sidebar The updated sidebar.
217+
* @param WP_REST_Request $request Request object.
218+
*/
219+
do_action( 'rest_save_sidebar', $sidebar, $request );
220+
212221
return $this->prepare_item_for_response( $sidebar, $request );
213222
}
214223

src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public function create_item_permissions_check( $request ) {
186186
public function create_item( $request ) {
187187
$sidebar_id = $request['sidebar'];
188188

189-
$widget_id = $this->save_widget( $request );
189+
$widget_id = $this->save_widget( $request, $sidebar_id );
190190

191191
if ( is_wp_error( $widget_id ) ) {
192192
return $widget_id;
@@ -248,7 +248,7 @@ public function update_item( $request ) {
248248
$request->has_param( 'instance' ) ||
249249
$request->has_param( 'form_data' )
250250
) {
251-
$maybe_error = $this->save_widget( $request );
251+
$maybe_error = $this->save_widget( $request, $sidebar_id );
252252
if ( is_wp_error( $maybe_error ) ) {
253253
return $maybe_error;
254254
}
@@ -356,6 +356,17 @@ public function delete_item( $request ) {
356356
);
357357
}
358358

359+
/**
360+
* Fires after a widget is deleted via the REST API.
361+
*
362+
* @since 5.8.0
363+
* @param string $widget_id ID of the widget marked for deletion.
364+
* @param string $sidebar_id ID of the sidebar the widget was deleted from.
365+
* @param WP_REST_Response $response The response data.
366+
* @param WP_REST_Request $request The request sent to the API.
367+
*/
368+
do_action( 'rest_delete_widget', $widget_id, $sidebar_id, $response, $request );
369+
359370
return $response;
360371
}
361372

@@ -385,11 +396,12 @@ protected function permissions_check() {
385396
*
386397
* @since 5.8.0
387398
*
388-
* @param WP_REST_Request $request Full details about the request.
399+
* @param WP_REST_Request $request Full details about the request.
400+
* @param string $sidebar_id ID of the sidebar the widget belongs to.
389401
*
390402
* @return string|WP_Error The saved widget ID.
391403
*/
392-
protected function save_widget( $request ) {
404+
protected function save_widget( $request, $sidebar_id ) {
393405
global $wp_widget_factory, $wp_registered_widget_updates;
394406

395407
require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number().
@@ -401,12 +413,14 @@ protected function save_widget( $request ) {
401413
$id_base = $parsed_id['id_base'];
402414
$number = isset( $parsed_id['number'] ) ? $parsed_id['number'] : null;
403415
$widget_object = $wp_widget_factory->get_widget_object( $id_base );
416+
$creating = false;
404417
} elseif ( $request['id_base'] ) {
405418
// Saving a new widget.
406419
$id_base = $request['id_base'];
407420
$widget_object = $wp_widget_factory->get_widget_object( $id_base );
408421
$number = $widget_object ? next_widget_id_number( $id_base ) : null;
409422
$id = $widget_object ? $id_base . '-' . $number : $id_base;
423+
$creating = true;
410424
} else {
411425
return new WP_Error(
412426
'rest_invalid_widget',
@@ -502,6 +516,17 @@ protected function save_widget( $request ) {
502516
$widget_object->updated = false;
503517
}
504518

519+
/**
520+
* Fires after a widget is created or updated via the REST API.
521+
*
522+
* @since 5.8.0
523+
* @param string $id ID of the widget being saved.
524+
* @param string $sidebar_id ID of the sidebar containing the widget being saved.
525+
* @param WP_REST_Request $request Request object.
526+
* @param bool $creating True when creating a widget, false when updating.
527+
*/
528+
do_action( 'rest_after_save_widget', $id, $sidebar_id, $request, $creating );
529+
505530
return $id;
506531
}
507532

0 commit comments

Comments
 (0)