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
This commit is contained in:
Timothy Jacobs 2021-06-25 13:17:20 +00:00
parent 67fc415084
commit 1de9c692f3
3 changed files with 82 additions and 2 deletions

View File

@ -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 ) {

View File

@ -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,

View File

@ -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 );