Skip to content

Commit 1de9c69

Browse files
REST API: Retrieve latest widgets before loading sidebars.
This fixes issues where sidebars would be unexpectedly missing from the new widgets screen. Running retrieve_widgets syncs sidebars that were registered after the last theme switch. Props walbo, hellofromTonya, noisysocks. Fixes #53489. git-svn-id: https://develop.svn.wordpress.org/trunk@51235 602fd350-edb4-49c9-b593-d223f7449a82
1 parent 67fc415 commit 1de9c69

File tree

3 files changed

+82
-2
lines changed

3 files changed

+82
-2
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,10 @@ public function get_items_permissions_check( $request ) {
9898
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
9999
*/
100100
public function get_items( $request ) {
101+
retrieve_widgets();
102+
101103
$data = array();
102-
foreach ( (array) wp_get_sidebars_widgets() as $id => $widgets ) {
104+
foreach ( wp_get_sidebars_widgets() as $id => $widgets ) {
103105
$sidebar = $this->get_sidebar( $id );
104106

105107
if ( ! $sidebar ) {
@@ -135,6 +137,8 @@ public function get_item_permissions_check( $request ) {
135137
* @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
136138
*/
137139
public function get_item( $request ) {
140+
retrieve_widgets();
141+
138142
$sidebar = $this->get_sidebar( $request['id'] );
139143

140144
if ( ! $sidebar ) {

tests/phpunit/tests/rest-api/rest-sidebars-controller.php

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88
*/
99

1010
/**
11-
* Tests for REST API for Menus.
11+
* Tests for REST API for Widgets.
1212
*
1313
* @see WP_Test_REST_Controller_Testcase
1414
* @group restapi
15+
* @group widgets
1516
* @covers WP_REST_Sidebars_Controller
1617
*/
1718
class WP_Test_REST_Sidebars_Controller extends WP_Test_REST_Controller_Testcase {
@@ -61,6 +62,18 @@ public function setUp() {
6162
update_option( 'sidebars_widgets', array() );
6263
}
6364

65+
function clean_up_global_scope() {
66+
global $wp_widget_factory, $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;
67+
68+
$wp_registered_sidebars = array();
69+
$wp_registered_widgets = array();
70+
$wp_registered_widget_controls = array();
71+
$wp_registered_widget_updates = array();
72+
$wp_widget_factory->widgets = array();
73+
74+
parent::clean_up_global_scope();
75+
}
76+
6477
private function setup_widget( $option_name, $number, $settings ) {
6578
update_option(
6679
$option_name,
@@ -128,6 +141,8 @@ public function test_context_param() {
128141
* @ticket 41683
129142
*/
130143
public function test_get_items() {
144+
wp_widgets_init();
145+
131146
$request = new WP_REST_Request( 'GET', '/wp/v2/sidebars' );
132147
$response = rest_get_server()->dispatch( $request );
133148
$data = $response->get_data();
@@ -193,6 +208,8 @@ public function test_get_items_basic_sidebar() {
193208
* @ticket 41683
194209
*/
195210
public function test_get_items_active_sidebar_with_widgets() {
211+
wp_widgets_init();
212+
196213
$this->setup_widget(
197214
'widget_rss',
198215
1,
@@ -241,6 +258,56 @@ public function test_get_items_active_sidebar_with_widgets() {
241258
);
242259
}
243260

261+
/**
262+
* @ticket 53489
263+
*/
264+
public function test_get_items_when_registering_new_sidebars() {
265+
register_sidebar(
266+
array(
267+
'name' => 'New Sidebar',
268+
'id' => 'new-sidebar',
269+
'before_widget' => '',
270+
'after_widget' => '',
271+
'before_title' => '',
272+
'after_title' => '',
273+
)
274+
);
275+
276+
$request = new WP_REST_Request( 'GET', '/wp/v2/sidebars' );
277+
$response = rest_get_server()->dispatch( $request );
278+
$data = $response->get_data();
279+
$data = $this->remove_links( $data );
280+
$this->assertSame(
281+
array(
282+
array(
283+
'id' => 'wp_inactive_widgets',
284+
'name' => 'Inactive widgets',
285+
'description' => '',
286+
'class' => '',
287+
'before_widget' => '',
288+
'after_widget' => '',
289+
'before_title' => '',
290+
'after_title' => '',
291+
'status' => 'inactive',
292+
'widgets' => array(),
293+
),
294+
array(
295+
'id' => 'new-sidebar',
296+
'name' => 'New Sidebar',
297+
'description' => '',
298+
'class' => '',
299+
'before_widget' => '',
300+
'after_widget' => '',
301+
'before_title' => '',
302+
'after_title' => '',
303+
'status' => 'active',
304+
'widgets' => array(),
305+
),
306+
),
307+
$data
308+
);
309+
}
310+
244311
/**
245312
* @ticket 41683
246313
*/
@@ -317,6 +384,8 @@ public function test_create_item() {
317384
* @ticket 41683
318385
*/
319386
public function test_update_item() {
387+
wp_widgets_init();
388+
320389
$this->setup_widget(
321390
'widget_rss',
322391
1,
@@ -382,6 +451,8 @@ public function test_update_item() {
382451
* @ticket 41683
383452
*/
384453
public function test_update_item_removes_widget_from_existing_sidebar() {
454+
wp_widgets_init();
455+
385456
$this->setup_widget(
386457
'widget_text',
387458
1,
@@ -423,6 +494,8 @@ public function test_update_item_removes_widget_from_existing_sidebar() {
423494
* @ticket 41683
424495
*/
425496
public function test_update_item_moves_omitted_widget_to_inactive_sidebar() {
497+
wp_widgets_init();
498+
426499
$this->setup_widget(
427500
'widget_text',
428501
1,
@@ -465,6 +538,8 @@ public function test_update_item_moves_omitted_widget_to_inactive_sidebar() {
465538
* @ticket 41683
466539
*/
467540
public function test_get_items_inactive_widgets() {
541+
wp_widgets_init();
542+
468543
$this->setup_widget(
469544
'widget_rss',
470545
1,

tests/phpunit/tests/rest-api/rest-widget-types-controller.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public function test_context_param() {
112112
* @ticket 41683
113113
*/
114114
public function test_get_items() {
115+
wp_widgets_init();
115116
wp_set_current_user( self::$admin_id );
116117
$request = new WP_REST_Request( 'GET', '/wp/v2/widget-types' );
117118
$response = rest_get_server()->dispatch( $request );

0 commit comments

Comments
 (0)