Make WordPress Core


Ignore:
Timestamp:
04/07/2016 08:58:56 PM (10 years ago)
Author:
ocean90
Message:

Customize: Harden assignment of Customizer settings transports for selective refreshable widgets

Theme support for customize-selective-refresh-widgets can be added _after_ the logic for registering the settings for incoming widgets that have been changed. This is due to themes adding the theme support in after_setup_theme which is also the action where WP_Customize_Widgets::register_settings() is called. If these both happen at priority 10, which one is called first depends on which one was added first. The other issue is that at the time that WP_Customize_Widgets::register_settings() is called at after_setup_theme, it is called before widgets_init and thus no widgets are yet registered. This means that any settings registered at this point will always have a refresh transport even if the theme supports customize-selective-refresh-widgets, since the WP_Widget instance is not visible yet to see if it supports selective refresh.

The fix: Defer WP_Customize_Widgets::register_settings() from after_setup_theme to widgets_init at priority 95 when the widget objects have all been registered. Also, ensure that the preview filter for sidebars_widgets is added before the sidebars are iterated for adding the controls.

Props westonruter.
Fixes #36389.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-customize-widgets.php

    r37040 r37166  
    100100
    101101        add_filter( 'customize_dynamic_setting_args',          array( $this, 'filter_customize_dynamic_setting_args' ), 10, 2 );
    102         add_action( 'after_setup_theme',                       array( $this, 'register_settings' ) );
     102        add_action( 'widgets_init',                            array( $this, 'register_settings' ), 95 );
    103103        add_action( 'wp_loaded',                               array( $this, 'override_sidebars_widgets_for_theme_switch' ) );
    104104        add_action( 'customize_controls_init',                 array( $this, 'customize_controls_init' ) );
     
    376376    public function customize_register() {
    377377        global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_sidebars;
     378
     379        add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 );
    378380
    379381        $sidebars_widgets = array_merge(
     
    510512            }
    511513        }
    512 
    513         add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 );
    514514    }
    515515
Note: See TracChangeset for help on using the changeset viewer.