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
This commit is contained in:
Robert Anderson 2021-06-28 04:33:36 +00:00
parent 15d4c97f1e
commit fba7649418
2 changed files with 31 additions and 8 deletions

View File

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

View File

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