diff --git a/src/wp-admin/customize.php b/src/wp-admin/customize.php index 6bf3490812..51db8b3ebb 100644 --- a/src/wp-admin/customize.php +++ b/src/wp-admin/customize.php @@ -250,6 +250,7 @@ do_action( 'customize_controls_print_scripts' ); $settings['settings'][ $id ] = array( 'value' => $setting->js_value(), 'transport' => $setting->transport, + 'dirty' => $setting->dirty, ); } diff --git a/src/wp-admin/js/customize-controls.js b/src/wp-admin/js/customize-controls.js index 831a46e240..d5c8746a57 100644 --- a/src/wp-admin/js/customize-controls.js +++ b/src/wp-admin/js/customize-controls.js @@ -17,6 +17,7 @@ this.id = id; this.transport = this.transport || 'refresh'; + this._dirty = options.dirty || false; this.bind( this.preview ); }, @@ -2516,7 +2517,8 @@ $.each( api.settings.settings, function( id, data ) { api.create( id, id, data.value, { transport: data.transport, - previewer: api.previewer + previewer: api.previewer, + dirty: !! data.dirty } ); }); diff --git a/src/wp-includes/class-wp-customize-setting.php b/src/wp-includes/class-wp-customize-setting.php index 5618314728..8bb3e9438b 100644 --- a/src/wp-includes/class-wp-customize-setting.php +++ b/src/wp-includes/class-wp-customize-setting.php @@ -60,6 +60,20 @@ class WP_Customize_Setting { public $sanitize_callback = ''; public $sanitize_js_callback = ''; + /** + * Whether or not the setting is initially dirty when created. + * + * This is used to ensure that a setting will be sent from the pane to the + * preview when loading the Customizer. Normally a setting only is synced to + * the preview if it has been changed. This allows the setting to be sent + * from the start. + * + * @since 4.2.0 + * @access public + * @var bool + */ + public $dirty = false; + protected $id_data = array(); /** diff --git a/src/wp-includes/class-wp-customize-widgets.php b/src/wp-includes/class-wp-customize-widgets.php index 674dee6c99..ef40e2d340 100644 --- a/src/wp-includes/class-wp-customize-widgets.php +++ b/src/wp-includes/class-wp-customize-widgets.php @@ -216,6 +216,7 @@ final class WP_Customize_Widgets { $sidebars_widgets = $this->old_sidebars_widgets; $sidebars_widgets = retrieve_widgets( 'customize' ); add_filter( 'option_sidebars_widgets', array( $this, 'filter_option_sidebars_widgets_for_theme_switch' ), 1 ); + unset( $GLOBALS['_wp_sidebars_widgets'] ); // reset global cache var used by wp_get_sidebars_widgets() } /** @@ -332,6 +333,7 @@ final class WP_Customize_Widgets { $setting_id = 'old_sidebars_widgets_data'; $setting_args = $this->get_setting_args( $setting_id, array( 'type' => 'global_variable', + 'dirty' => true, ) ); $this->manager->add_setting( $setting_id, $setting_args ); } @@ -356,6 +358,9 @@ final class WP_Customize_Widgets { $setting_id = sprintf( 'sidebars_widgets[%s]', $sidebar_id ); $setting_args = $this->get_setting_args( $setting_id ); if ( ! $this->manager->get_setting( $setting_id ) ) { + if ( ! $this->manager->is_theme_active() ) { + $setting_args['dirty'] = true; + } $this->manager->add_setting( $setting_id, $setting_args ); } $new_setting_ids[] = $setting_id; diff --git a/tests/phpunit/tests/customize/setting.php b/tests/phpunit/tests/customize/setting.php index 388cf1aefd..51d42801d9 100644 --- a/tests/phpunit/tests/customize/setting.php +++ b/tests/phpunit/tests/customize/setting.php @@ -44,6 +44,7 @@ class Tests_WP_Customize_Setting extends WP_UnitTestCase { $this->assertEquals( '', $setting->sanitize_js_callback ); $this->assertFalse( has_filter( "customize_sanitize_{$setting->id}" ) ); $this->assertFalse( has_filter( "customize_sanitize_js_{$setting->id}" ) ); + $this->assertEquals( false, $setting->dirty ); } function test_constructor_with_args() {