From fba7649418eeb43f20e4a4a9521d252cfb4f9921 Mon Sep 17 00:00:00 2001 From: Robert Anderson Date: Mon, 28 Jun 2021 04:33:36 +0000 Subject: [PATCH] Widgets REST API: Fix non-multi widgets not appearing in wp_inactive_widgets Registered widgets that do not extend WP_Widget should appear in the wp_inactive_widgets sidebar by default. Having the widgets REST API call retrieve_widgets() before serving any request ensures that this will happen. This is a similar fix to [51235]. Fixes #53534. Props zieladam, timothyblynjacobs. git-svn-id: https://develop.svn.wordpress.org/trunk@51248 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-rest-widgets-controller.php | 8 +++++ .../rest-api/rest-widgets-controller.php | 31 ++++++++++++++----- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php index b3bd5ae5ac..5fb9b8f6e1 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php @@ -109,6 +109,8 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller { * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function get_items( $request ) { + retrieve_widgets(); + $prepared = array(); foreach ( wp_get_sidebars_widgets() as $sidebar_id => $widget_ids ) { @@ -149,6 +151,8 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller { * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function get_item( $request ) { + retrieve_widgets(); + $widget_id = $request['id']; $sidebar_id = wp_find_widgets_sidebar( $widget_id ); @@ -230,6 +234,8 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller { public function update_item( $request ) { global $wp_widget_factory; + retrieve_widgets(); + $widget_id = $request['id']; $sidebar_id = wp_find_widgets_sidebar( $widget_id ); @@ -291,6 +297,8 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller { public function delete_item( $request ) { global $wp_registered_widget_updates; + retrieve_widgets(); + $widget_id = $request['id']; $sidebar_id = wp_find_widgets_sidebar( $widget_id ); diff --git a/tests/phpunit/tests/rest-api/rest-widgets-controller.php b/tests/phpunit/tests/rest-api/rest-widgets-controller.php index fc815e7aa2..594458598b 100644 --- a/tests/phpunit/tests/rest-api/rest-widgets-controller.php +++ b/tests/phpunit/tests/rest-api/rest-widgets-controller.php @@ -95,20 +95,14 @@ class WP_Test_REST_Widgets_Controller extends WP_Test_REST_Controller_Testcase { } public function setUp() { - global $wp_registered_widgets, $wp_registered_sidebars, $_wp_sidebars_widgets, $wp_widget_factory; + global $wp_widget_factory; parent::setUp(); wp_set_current_user( self::$admin_id ); - // Unregister all widgets and sidebars. - $wp_registered_widgets = array(); - $wp_registered_sidebars = array(); - $_wp_sidebars_widgets = array(); - update_option( 'sidebars_widgets', array() ); - // Re-register core widgets. - $wp_widget_factory->_register_widgets(); + wp_widgets_init(); // Register a non-multi widget for testing. wp_register_widget_control( @@ -149,6 +143,27 @@ class WP_Test_REST_Widgets_Controller extends WP_Test_REST_Controller_Testcase { ); } + public function clean_up_global_scope() { + global + $wp_widget_factory, + $wp_registered_sidebars, + $wp_registered_widgets, + $wp_registered_widget_controls, + $wp_registered_widget_updates, + $_wp_sidebars_widgets; + + $wp_registered_sidebars = array(); + $wp_registered_widgets = array(); + $wp_registered_widget_controls = array(); + $wp_registered_widget_updates = array(); + $wp_widget_factory->widgets = array(); + $_wp_sidebars_widgets = array(); + + update_option( 'sidebars_widgets', array() ); + + parent::clean_up_global_scope(); + } + private function setup_widget( $id_base, $number, $settings ) { global $wp_widget_factory;