Make WordPress Core

Changeset 51235


Ignore:
Timestamp:
06/25/2021 01:17:20 PM (3 years ago)
Author:
TimothyBlynJacobs
Message:

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.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php

    r51210 r51235  
    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
     
    136138     */
    137139    public function get_item( $request ) {
     140        retrieve_widgets();
     141
    138142        $sidebar = $this->get_sidebar( $request['id'] );
    139143
  • trunk/tests/phpunit/tests/rest-api/rest-sidebars-controller.php

    r51079 r51235  
    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 */
     
    6061        $_wp_sidebars_widgets   = array();
    6162        update_option( 'sidebars_widgets', array() );
     63    }
     64
     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();
    6275    }
    6376
     
    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 );
     
    194209     */
    195210    public function test_get_items_active_sidebar_with_widgets() {
     211        wp_widgets_init();
     212
    196213        $this->setup_widget(
    197214            'widget_rss',
     
    243260
    244261    /**
     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
     311    /**
    245312     * @ticket 41683
    246313     */
     
    318385     */
    319386    public function test_update_item() {
     387        wp_widgets_init();
     388
    320389        $this->setup_widget(
    321390            'widget_rss',
     
    383452     */
    384453    public function test_update_item_removes_widget_from_existing_sidebar() {
     454        wp_widgets_init();
     455
    385456        $this->setup_widget(
    386457            'widget_text',
     
    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',
     
    466539     */
    467540    public function test_get_items_inactive_widgets() {
     541        wp_widgets_init();
     542
    468543        $this->setup_widget(
    469544            'widget_rss',
  • trunk/tests/phpunit/tests/rest-api/rest-widget-types-controller.php

    r51183 r51235  
    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' );
Note: See TracChangeset for help on using the changeset viewer.