diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php index 4c1e82fbdb..3ab7dc993b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php @@ -98,8 +98,10 @@ class WP_REST_Sidebars_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(); + $data = array(); - foreach ( (array) wp_get_sidebars_widgets() as $id => $widgets ) { + foreach ( wp_get_sidebars_widgets() as $id => $widgets ) { $sidebar = $this->get_sidebar( $id ); if ( ! $sidebar ) { @@ -135,6 +137,8 @@ class WP_REST_Sidebars_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(); + $sidebar = $this->get_sidebar( $request['id'] ); if ( ! $sidebar ) { diff --git a/tests/phpunit/tests/rest-api/rest-sidebars-controller.php b/tests/phpunit/tests/rest-api/rest-sidebars-controller.php index ff9d8dfba5..a14b6bf17b 100644 --- a/tests/phpunit/tests/rest-api/rest-sidebars-controller.php +++ b/tests/phpunit/tests/rest-api/rest-sidebars-controller.php @@ -8,10 +8,11 @@ */ /** - * Tests for REST API for Menus. + * Tests for REST API for Widgets. * * @see WP_Test_REST_Controller_Testcase * @group restapi + * @group widgets * @covers WP_REST_Sidebars_Controller */ class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase { @@ -61,6 +62,18 @@ class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase update_option( 'sidebars_widgets', array() ); } + function clean_up_global_scope() { + global $wp_widget_factory, $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates; + + $wp_registered_sidebars = array(); + $wp_registered_widgets = array(); + $wp_registered_widget_controls = array(); + $wp_registered_widget_updates = array(); + $wp_widget_factory->widgets = array(); + + parent::clean_up_global_scope(); + } + private function setup_widget( $option_name, $number, $settings ) { update_option( $option_name, @@ -128,6 +141,8 @@ class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase * @ticket 41683 */ public function test_get_items() { + wp_widgets_init(); + $request = new WP_REST_Request( 'GET', '/wp/v2/sidebars' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); @@ -193,6 +208,8 @@ class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase * @ticket 41683 */ public function test_get_items_active_sidebar_with_widgets() { + wp_widgets_init(); + $this->setup_widget( 'widget_rss', 1, @@ -241,6 +258,56 @@ class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase ); } + /** + * @ticket 53489 + */ + public function test_get_items_when_registering_new_sidebars() { + register_sidebar( + array( + 'name' => 'New Sidebar', + 'id' => 'new-sidebar', + 'before_widget' => '', + 'after_widget' => '', + 'before_title' => '', + 'after_title' => '', + ) + ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/sidebars' ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + $data = $this->remove_links( $data ); + $this->assertSame( + array( + array( + 'id' => 'wp_inactive_widgets', + 'name' => 'Inactive widgets', + 'description' => '', + 'class' => '', + 'before_widget' => '', + 'after_widget' => '', + 'before_title' => '', + 'after_title' => '', + 'status' => 'inactive', + 'widgets' => array(), + ), + array( + 'id' => 'new-sidebar', + 'name' => 'New Sidebar', + 'description' => '', + 'class' => '', + 'before_widget' => '', + 'after_widget' => '', + 'before_title' => '', + 'after_title' => '', + 'status' => 'active', + 'widgets' => array(), + ), + ), + $data + ); + } + /** * @ticket 41683 */ @@ -317,6 +384,8 @@ class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase * @ticket 41683 */ public function test_update_item() { + wp_widgets_init(); + $this->setup_widget( 'widget_rss', 1, @@ -382,6 +451,8 @@ class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase * @ticket 41683 */ public function test_update_item_removes_widget_from_existing_sidebar() { + wp_widgets_init(); + $this->setup_widget( 'widget_text', 1, @@ -423,6 +494,8 @@ class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase * @ticket 41683 */ public function test_update_item_moves_omitted_widget_to_inactive_sidebar() { + wp_widgets_init(); + $this->setup_widget( 'widget_text', 1, @@ -465,6 +538,8 @@ class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase * @ticket 41683 */ public function test_get_items_inactive_widgets() { + wp_widgets_init(); + $this->setup_widget( 'widget_rss', 1, diff --git a/tests/phpunit/tests/rest-api/rest-widget-types-controller.php b/tests/phpunit/tests/rest-api/rest-widget-types-controller.php index 6082931e42..cd84b91c48 100644 --- a/tests/phpunit/tests/rest-api/rest-widget-types-controller.php +++ b/tests/phpunit/tests/rest-api/rest-widget-types-controller.php @@ -112,6 +112,7 @@ class WP_Test_REST_Widget_Types_Controller extends WP_Test_REST_Controller_Testc * @ticket 41683 */ public function test_get_items() { + wp_widgets_init(); wp_set_current_user( self::$admin_id ); $request = new WP_REST_Request( 'GET', '/wp/v2/widget-types' ); $response = rest_get_server()->dispatch( $request );