Make WordPress Core

Ticket #27355: 27355.wip2.diff

File 27355.wip2.diff, 22.2 KB (added by westonruter, 10 years ago)

https://github.com/xwp/wordpress-develop/commit/0f61a9e3c1726d5f80a85133b6d592cf992a79c7

  • src/wp-admin/customize.php

    diff --git src/wp-admin/customize.php src/wp-admin/customize.php
    index 1f85ec6..63fd528 100644
    if ( ! $return ) { 
    3333        }
    3434}
    3535
     36/**
     37 * @var WP_Customize_Manager $wp_customize
     38 */
    3639global $wp_scripts, $wp_customize;
    3740
    3841$registered = $wp_scripts->registered;
    do_action( 'customize_controls_print_scripts' ); 
    257260
    258261        // Prepare Customize Setting objects to pass to Javascript.
    259262        foreach ( $wp_customize->settings() as $id => $setting ) {
    260                 $settings['settings'][ $id ] = array(
    261                         'value'     => $setting->js_value(),
    262                         'transport' => $setting->transport,
    263                 );
     263                $settings['settings'][ $id ] = $setting->json();
    264264        }
    265265
    266266        // Prepare Customize Control objects to pass to JavaScript.
  • src/wp-admin/js/customize-controls.js

    diff --git src/wp-admin/js/customize-controls.js src/wp-admin/js/customize-controls.js
    index 66d63bd..87dabb4 100644
     
    16561656                                        self.send( 'active' );
    16571657                                });
    16581658
     1659                                var settings = {};
     1660                                api.each( function ( setting, id) {
     1661                                        settings[ id ] = {
     1662                                                value: setting.get(),
     1663                                                selector: setting.selector
     1664                                        };
     1665                                } );
     1666
    16591667                                this.send( 'sync', {
    16601668                                        scroll:   self.scroll,
    1661                                         settings: api.get()
     1669                                        settings: settings
    16621670                                });
    16631671                        });
    16641672
     
    18701878
    18711879                // Create Settings
    18721880                $.each( api.settings.settings, function( id, data ) {
    1873                         api.create( id, id, data.value, {
    1874                                 transport: data.transport,
     1881                        var options = $.extend( {}, data, {
    18751882                                previewer: api.previewer
    18761883                        } );
     1884                        delete options.value; // remove duplicate
     1885                        api.create( id, id, data.value, options );
    18771886                });
    18781887
    18791888                // Create Panels
  • src/wp-content/themes/twentyfifteen/inc/customizer.php

    diff --git src/wp-content/themes/twentyfifteen/inc/customizer.php src/wp-content/themes/twentyfifteen/inc/customizer.php
    index 87636e7..156993a 100644
    function twentyfifteen_customize_register( $wp_customize ) { 
    1818        $color_scheme = twentyfifteen_get_color_scheme();
    1919
    2020        $wp_customize->get_setting( 'blogname' )->transport         = 'postMessage';
     21        $wp_customize->get_setting( 'blogname' )->selector          = '.site-title a';
    2122        $wp_customize->get_setting( 'blogdescription' )->transport  = 'postMessage';
     23        $wp_customize->get_setting( 'blogdescription' )->selector   = '.site-description';
    2224        $wp_customize->get_setting( 'background_color' )->transport = 'refresh';
    2325
    2426        // Add color scheme setting and control.
  • src/wp-content/themes/twentyfifteen/js/customizer.js

    diff --git src/wp-content/themes/twentyfifteen/js/customizer.js src/wp-content/themes/twentyfifteen/js/customizer.js
    index 0aa9728..fa9bee8 100644
     
    66
    77( function( $ ) {
    88        // Site title and description.
    9         wp.customize( 'blogname', function( value ) {
    10                 value.bind( function( to ) {
    11                         $( '.site-title a' ).text( to );
     9        wp.customize( 'blogname', function( setting ) {
     10                setting.bind( function( to ) {
     11                        $( setting.selector ).text( to );
    1212                } );
    1313        } );
    14         wp.customize( 'blogdescription', function( value ) {
    15                 value.bind( function( to ) {
    16                         $( '.site-description' ).text( to );
     14        wp.customize( 'blogdescription', function( setting ) {
     15                setting.bind( function( to ) {
     16                        $( setting.selector ).text( to );
    1717                } );
    1818        } );
    19 } )( jQuery );
    20  No newline at end of file
     19} )( jQuery );
  • src/wp-includes/class-wp-customize-manager.php

    diff --git src/wp-includes/class-wp-customize-manager.php src/wp-includes/class-wp-customize-manager.php
    index 987edc6..a579dca 100644
    final class WP_Customize_Manager { 
    296296         *
    297297         * @since 3.4.0
    298298         *
    299          * @return array
     299         * @return WP_Customize_Setting[]
    300300         */
    301301        public function settings() {
    302302                return $this->settings;
    final class WP_Customize_Manager { 
    307307         *
    308308         * @since 3.4.0
    309309         *
    310          * @return array
     310         * @return WP_Customize_Control[]
    311311         */
    312312        public function controls() {
    313313                return $this->controls;
    final class WP_Customize_Manager { 
    329329         *
    330330         * @since 3.4.0
    331331         *
    332          * @return array
     332         * @return WP_Customize_Section[]
    333333         */
    334334        public function sections() {
    335335                return $this->sections;
    final class WP_Customize_Manager { 
    341341         * @since 4.0.0
    342342         * @access public
    343343         *
    344          * @return array Panels.
     344         * @return WP_Customize_Panel[]
    345345         */
    346346        public function panels() {
    347347                return $this->panels;
    final class WP_Customize_Manager { 
    496496         */
    497497        public function customize_preview_settings() {
    498498                $settings = array(
    499                         'values'  => array(),
    500499                        'channel' => wp_unslash( $_POST['customize_messenger_channel'] ),
    501500                        'activePanels' => array(),
    502501                        'activeSections' => array(),
    final class WP_Customize_Manager { 
    510509                        );
    511510                }
    512511
    513                 foreach ( $this->settings as $id => $setting ) {
    514                         $settings['values'][ $id ] = $setting->js_value();
    515                 }
    516512                foreach ( $this->panels as $id => $panel ) {
    517513                        $settings['activePanels'][ $id ] = $panel->active();
    518514                }
  • src/wp-includes/class-wp-customize-setting.php

    diff --git src/wp-includes/class-wp-customize-setting.php src/wp-includes/class-wp-customize-setting.php
    index 7d3511c..8d62d52 100644
     
    1010 */
    1111class WP_Customize_Setting {
    1212        /**
     13         * Manager class instance.
     14         *
    1315         * @access public
    1416         * @var WP_Customize_Manager
    1517         */
    1618        public $manager;
    1719
    1820        /**
     21         * ID for control.
     22         *
    1923         * @access public
    2024         * @var string
    2125         */
    2226        public $id;
    2327
    2428        /**
     29         * Type of data that this setting represents.
     30         *
    2531         * @access public
    2632         * @var string
    2733         */
    class WP_Customize_Setting { 
    3036        /**
    3137         * Capability required to edit this setting.
    3238         *
     39         * @access public
    3340         * @var string
    3441         */
    3542        public $capability = 'edit_theme_options';
    class WP_Customize_Setting { 
    4148         * @var string
    4249         */
    4350        public $theme_supports  = '';
    44         public $default         = '';
    45         public $transport       = 'refresh';
    4651
    4752        /**
    48          * Server-side sanitization callback for the setting's value.
     53         * Default value for setting when associated theme_mod/option/etc is absent.
     54         *
     55         * @access public
     56         * @var string
     57         */
     58        public $default = '';
     59
     60        /**
     61         * Transport mechanism for updating the theme preview when a setting changes.
     62         *
     63         * The values 'refresh' and 'postMessage' have associated behaviors.
     64         *
     65         * @access public
     66         * @var string
     67         */
     68        public $transport = 'refresh';
     69
     70        /**
     71         * Server-side sanitization callback for the setting's value when saved to the DB.
     72         *
     73         * This callback is automatically added as a filter for customize_sanitize_{$this->id}.
     74         *
     75         * @access public
     76         * @var callback
     77         */
     78        public $sanitize_callback = '';
     79
     80        /**
     81         * Server-side sanitization callback for the setting's value exported to JS.
    4982         *
     83         * This callback is automatically added as a filter for customize_sanitize_js_{$this->id}
     84         *
     85         * @access public
    5086         * @var callback
    5187         */
    52         public $sanitize_callback    = '';
    5388        public $sanitize_js_callback = '';
    5489
     90        /**
     91         * jQuery selector for the element(s) on the frontend which render data.
     92         *
     93         * Multiple selectors may be separated by commas.
     94         *
     95         * @access public
     96         * @var string
     97         */
     98        public $selector = '';
     99
     100        /**
     101         * The ID parsed into its multidimensional parts.
     102         *
     103         * @access protected
     104         * @var array
     105         */
    55106        protected $id_data = array();
    56107
    57108        /**
    class WP_Customize_Setting { 
    78129        public function __construct( $manager, $id, $args = array() ) {
    79130                $keys = array_keys( get_object_vars( $this ) );
    80131                foreach ( $keys as $key ) {
    81                         if ( isset( $args[ $key ] ) )
     132                        if ( isset( $args[ $key ] ) ) {
    82133                                $this->$key = $args[ $key ];
     134                        }
    83135                }
    84136
    85137                $this->manager = $manager;
    86138                $this->id = $id;
    87139
    88140                // Parse the ID for array keys.
    89                 $this->id_data[ 'keys' ] = preg_split( '/\[/', str_replace( ']', '', $this->id ) );
    90                 $this->id_data[ 'base' ] = array_shift( $this->id_data[ 'keys' ] );
     141                $this->id_data['keys'] = preg_split( '/\[/', str_replace( ']', '', $this->id ) );
     142                $this->id_data['base'] = array_shift( $this->id_data['keys'] );
    91143
    92144                // Rebuild the ID.
    93                 $this->id = $this->id_data[ 'base' ];
    94                 if ( ! empty( $this->id_data[ 'keys' ] ) )
    95                         $this->id .= '[' . implode( '][', $this->id_data[ 'keys' ] ) . ']';
     145                $this->id = $this->id_data['base'];
     146                if ( ! empty( $this->id_data['keys'] ) ) {
     147                        $this->id .= '[' . implode( '][', $this->id_data['keys'] ) . ']';
     148                }
    96149
    97                 if ( $this->sanitize_callback )
     150                if ( $this->sanitize_callback ) {
    98151                        add_filter( "customize_sanitize_{$this->id}", $this->sanitize_callback, 10, 2 );
     152                }
    99153
    100                 if ( $this->sanitize_js_callback )
     154                if ( $this->sanitize_js_callback ) {
    101155                        add_filter( "customize_sanitize_js_{$this->id}", $this->sanitize_js_callback, 10, 2 );
     156                }
    102157
    103158                return $this;
    104159        }
    class WP_Customize_Setting { 
    109164         * @since 3.4.0
    110165         */
    111166        public function preview() {
    112                 switch( $this->type ) {
     167                switch ( $this->type ) {
    113168                        case 'theme_mod' :
    114                                 add_filter( 'theme_mod_' . $this->id_data[ 'base' ], array( $this, '_preview_filter' ) );
     169                                add_filter( 'theme_mod_' . $this->id_data['base'], array( $this, '_preview_filter' ) );
    115170                                break;
    116171                        case 'option' :
    117                                 if ( empty( $this->id_data[ 'keys' ] ) )
    118                                         add_filter( 'pre_option_' . $this->id_data[ 'base' ], array( $this, '_preview_filter' ) );
    119                                 else {
    120                                         add_filter( 'option_' . $this->id_data[ 'base' ], array( $this, '_preview_filter' ) );
    121                                         add_filter( 'default_option_' . $this->id_data[ 'base' ], array( $this, '_preview_filter' ) );
     172                                if ( empty( $this->id_data['keys'] ) ) {
     173                                        add_filter( 'pre_option_' . $this->id_data['base'], array( $this, '_preview_filter' ) );
     174                                } else {
     175                                        add_filter( 'option_' . $this->id_data['base'], array( $this, '_preview_filter' ) );
     176                                        add_filter( 'default_option_' . $this->id_data['base'], array( $this, '_preview_filter' ) );
    122177                                }
    123178                                break;
    124179                        default :
    class WP_Customize_Setting { 
    159214         * @return mixed New or old value.
    160215         */
    161216        public function _preview_filter( $original ) {
    162                 return $this->multidimensional_replace( $original, $this->id_data[ 'keys' ], $this->post_value() );
     217                return $this->multidimensional_replace( $original, $this->id_data['keys'], $this->post_value() );
    163218        }
    164219
    165220        /**
    class WP_Customize_Setting { 
    173228        public final function save() {
    174229                $value = $this->post_value();
    175230
    176                 if ( ! $this->check_capabilities() || ! isset( $value ) )
     231                if ( ! $this->check_capabilities() || ! isset( $value ) ) {
    177232                        return false;
     233                }
    178234
    179235                /**
    180236                 * Fires when the WP_Customize_Setting::save() method is called.
    class WP_Customize_Setting { 
    186242                 *
    187243                 * @param WP_Customize_Setting $this WP_Customize_Setting instance.
    188244                 */
    189                 do_action( 'customize_save_' . $this->id_data[ 'base' ], $this );
     245                do_action( 'customize_save_' . $this->id_data['base'], $this );
    190246
    191247                $this->update( $value );
     248                return true;
    192249        }
    193250
    194251        /**
    class WP_Customize_Setting { 
    201258         */
    202259        public final function post_value( $default = null ) {
    203260                // Check for a cached value
    204                 if ( isset( $this->_post_value ) )
     261                if ( isset( $this->_post_value ) ) {
    205262                        return $this->_post_value;
     263                }
    206264
    207265                // Call the manager for the post value
    208266                $result = $this->manager->post_value( $this );
    209267
    210                 if ( isset( $result ) )
     268                if ( isset( $result ) ) {
    211269                        return $this->_post_value = $result;
    212                 else
     270                } else {
    213271                        return $default;
     272                }
    214273        }
    215274
    216275        /**
    class WP_Customize_Setting { 
    244303         * @return mixed The result of saving the value.
    245304         */
    246305        protected function update( $value ) {
    247                 switch( $this->type ) {
     306                switch ( $this->type ) {
    248307                        case 'theme_mod' :
    249308                                return $this->_update_theme_mod( $value );
    250309
    class WP_Customize_Setting { 
    274333         * @since 3.4.0
    275334         *
    276335         * @param mixed $value The value to update.
    277          * @return mixed The result of saving the value.
     336         * @return bool The result of saving the value.
    278337         */
    279338        protected function _update_theme_mod( $value ) {
    280339                // Handle non-array theme mod.
    281                 if ( empty( $this->id_data[ 'keys' ] ) )
    282                         return set_theme_mod( $this->id_data[ 'base' ], $value );
     340                if ( empty( $this->id_data['keys'] ) ) {
     341                        set_theme_mod( $this->id_data['base'], $value );
     342                        return true;
     343                }
    283344
    284345                // Handle array-based theme mod.
    285                 $mods = get_theme_mod( $this->id_data[ 'base' ] );
    286                 $mods = $this->multidimensional_replace( $mods, $this->id_data[ 'keys' ], $value );
    287                 if ( isset( $mods ) )
    288                         return set_theme_mod( $this->id_data[ 'base' ], $mods );
     346                $mods = get_theme_mod( $this->id_data['base'] );
     347                $mods = $this->multidimensional_replace( $mods, $this->id_data['keys'], $value );
     348                if ( isset( $mods ) ) {
     349                        set_theme_mod( $this->id_data['base'], $mods );
     350                        return true;
     351                }
     352                return false;
    289353        }
    290354
    291355        /**
    class WP_Customize_Setting { 
    294358         * @since 3.4.0
    295359         *
    296360         * @param mixed $value The value to update.
    297          * @return mixed The result of saving the value.
     361         * @return bool The result of saving the value.
    298362         */
    299363        protected function _update_option( $value ) {
    300364                // Handle non-array option.
    301                 if ( empty( $this->id_data[ 'keys' ] ) )
    302                         return update_option( $this->id_data[ 'base' ], $value );
     365                if ( empty( $this->id_data['keys'] ) ) {
     366                        return update_option( $this->id_data['base'], $value );
     367                }
    303368
    304369                // Handle array-based options.
    305                 $options = get_option( $this->id_data[ 'base' ] );
    306                 $options = $this->multidimensional_replace( $options, $this->id_data[ 'keys' ], $value );
    307                 if ( isset( $options ) )
    308                         return update_option( $this->id_data[ 'base' ], $options );
     370                $options = get_option( $this->id_data['base'] );
     371                $options = $this->multidimensional_replace( $options, $this->id_data['keys'], $value );
     372                if ( isset( $options ) ) {
     373                        return update_option( $this->id_data['base'], $options );
     374                }
     375                return false;
    309376        }
    310377
    311378        /**
    class WP_Customize_Setting { 
    317384         */
    318385        public function value() {
    319386                // Get the callback that corresponds to the setting type.
    320                 switch( $this->type ) {
     387                switch ( $this->type ) {
    321388                        case 'theme_mod' :
    322389                                $function = 'get_theme_mod';
    323390                                break;
    class WP_Customize_Setting { 
    339406                                 *
    340407                                 * @param mixed $default The setting default value. Default empty.
    341408                                 */
    342                                 return apply_filters( 'customize_value_' . $this->id_data[ 'base' ], $this->default );
     409                                return apply_filters( 'customize_value_' . $this->id_data['base'], $this->default );
    343410                }
    344411
    345412                // Handle non-array value
    346                 if ( empty( $this->id_data[ 'keys' ] ) )
    347                         return $function( $this->id_data[ 'base' ], $this->default );
     413                if ( empty( $this->id_data['keys'] ) ) {
     414                        return $function( $this->id_data['base'], $this->default );
     415                }
    348416
    349417                // Handle array-based value
    350                 $values = $function( $this->id_data[ 'base' ] );
    351                 return $this->multidimensional_get( $values, $this->id_data[ 'keys' ], $this->default );
     418                $values = $function( $this->id_data['base'] );
     419                return $this->multidimensional_get( $values, $this->id_data['keys'], $this->default );
    352420        }
    353421
    354422        /**
    class WP_Customize_Setting { 
    372440                 */
    373441                $value = apply_filters( "customize_sanitize_js_{$this->id}", $this->value(), $this );
    374442
    375                 if ( is_string( $value ) )
    376                         return html_entity_decode( $value, ENT_QUOTES, 'UTF-8');
     443                if ( is_string( $value ) ) {
     444                        return html_entity_decode( $value, ENT_QUOTES, 'UTF-8' );
     445                }
    377446
    378447                return $value;
    379448        }
    380449
    381450        /**
     451         * Gather the parameters passed to client JavaScript via JSON.
     452         *
     453         * @since 4.1.0
     454         *
     455         * @return array The array to be exported to the client as JSON
     456         */
     457        public function json() {
     458                $array = wp_array_slice_assoc( (array) $this, array( 'transport', 'selector' ) );
     459                $array['value'] = $this->js_value();
     460                return $array;
     461        }
     462
     463        /**
    382464         * Validate user capabilities whether the theme supports the setting.
    383465         *
    384466         * @since 3.4.0
    class WP_Customize_Setting { 
    386468         * @return bool False if theme doesn't support the setting or user can't change setting, otherwise true.
    387469         */
    388470        public final function check_capabilities() {
    389                 if ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) )
     471                if ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) ) {
    390472                        return false;
     473                }
    391474
    392                 if ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) )
     475                if ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) ) {
    393476                        return false;
     477                }
    394478
    395479                return true;
    396480        }
    class WP_Customize_Setting { 
    400484         *
    401485         * @since 3.4.0
    402486         *
    403          * @param $root
    404          * @param $keys
     487         * @param array $root
     488         * @param null|array $keys
    405489         * @param bool $create Default is false.
    406490         * @return null|array Keys are 'root', 'node', and 'key'.
    407491         */
    408492        final protected function multidimensional( &$root, $keys, $create = false ) {
    409                 if ( $create && empty( $root ) )
     493                if ( $create && empty( $root ) ) {
    410494                        $root = array();
     495                }
    411496
    412                 if ( ! isset( $root ) || empty( $keys ) )
    413                         return;
     497                if ( ! isset( $root ) || empty( $keys ) ) {
     498                        return null;
     499                }
    414500
    415501                $last = array_pop( $keys );
    416502                $node = &$root;
    417503
    418504                foreach ( $keys as $key ) {
    419                         if ( $create && ! isset( $node[ $key ] ) )
     505                        if ( $create && ! isset( $node[ $key ] ) ) {
    420506                                $node[ $key ] = array();
     507                        }
    421508
    422                         if ( ! is_array( $node ) || ! isset( $node[ $key ] ) )
    423                                 return;
     509                        if ( ! is_array( $node ) || ! isset( $node[ $key ] ) ) {
     510                                return null;
     511                        }
    424512
    425513                        $node = &$node[ $key ];
    426514                }
    427515
    428                 if ( $create && ! isset( $node[ $last ] ) )
     516                if ( $create && ! isset( $node[ $last ] ) ) {
    429517                        $node[ $last ] = array();
     518                }
    430519
    431                 if ( ! isset( $node[ $last ] ) )
    432                         return;
     520                if ( ! isset( $node[ $last ] ) ) {
     521                        return null;
     522                }
    433523
    434524                return array(
    435525                        'root' => &$root,
    class WP_Customize_Setting { 
    445535         *
    446536         * @param $root
    447537         * @param $keys
     538         * @param $value
    448539         * @param mixed $value The value to update.
    449          * @return
     540         * @return mixed
    450541         */
    451542        final protected function multidimensional_replace( $root, $keys, $value ) {
    452                 if ( ! isset( $value ) )
     543                if ( ! isset( $value ) ) {
    453544                        return $root;
    454                 elseif ( empty( $keys ) ) // If there are no keys, we're replacing the root.
     545                } elseif ( empty( $keys ) ) { // If there are no keys, we're replacing the root.
    455546                        return $value;
     547                }
    456548
    457549                $result = $this->multidimensional( $root, $keys, true );
    458550
    459                 if ( isset( $result ) )
     551                if ( isset( $result ) ) {
    460552                        $result['node'][ $result['key'] ] = $value;
     553                }
    461554
    462555                return $root;
    463556        }
    class WP_Customize_Setting { 
    468561         * @since 3.4.0
    469562         *
    470563         * @param $root
    471          * @param $keys
    472          * @param $default A default value which is used as a fallback. Default is null.
     564         * @param null|array $keys
     565         * @param mixed $default A default value which is used as a fallback. Default is null.
    473566         * @return mixed The requested value or the default value.
    474567         */
    475568        final protected function multidimensional_get( $root, $keys, $default = null ) {
    476                 if ( empty( $keys ) ) // If there are no keys, test the root.
     569                if ( empty( $keys ) ) { // If there are no keys, test the root.
    477570                        return isset( $root ) ? $root : $default;
     571                }
    478572
    479573                $result = $this->multidimensional( $root, $keys );
    480574                return isset( $result ) ? $result['node'][ $result['key'] ] : $default;
    class WP_Customize_Setting { 
    507601class WP_Customize_Filter_Setting extends WP_Customize_Setting {
    508602
    509603        /**
     604         * Override WP_Customize_Setting::update() to no-op.
     605         *
    510606         * @since 3.4.0
     607         *
     608         * @param mixed $value
     609         * @return bool
    511610         */
    512         public function update( $value ) {}
     611        public function update( $value ) {
     612                return true;
     613        }
    513614}
    514615
    515616/**
    final class WP_Customize_Header_Image_Setting extends WP_Customize_Setting { 
    528629         * @since 3.4.0
    529630         *
    530631         * @param $value
     632         * @return bool
    531633         */
    532634        public function update( $value ) {
     635                /**
     636                 * @var Custom_Image_Header $custom_image_header
     637                 */
    533638                global $custom_image_header;
    534639
    535                 // If the value doesn't exist (removed or random),
    536                 // use the header_image value.
    537                 if ( ! $value )
    538                         $value = $this->manager->get_setting('header_image')->post_value();
     640                /*
     641                 * If the value doesn't exist (removed or random),
     642                 * use the header_image value.
     643                 */
     644                if ( ! $value ) {
     645                        $value = $this->manager->get_setting( 'header_image' )->post_value();
     646                }
    539647
    540                 if ( is_array( $value ) && isset( $value['choice'] ) )
     648                if ( is_array( $value ) && isset( $value['choice'] ) ) {
    541649                        $custom_image_header->set_header_image( $value['choice'] );
    542                 else
     650                } else {
    543651                        $custom_image_header->set_header_image( $value );
     652                }
     653                return true;
    544654        }
    545655}
    546656
    final class WP_Customize_Background_Image_Setting extends WP_Customize_Setting { 
    558668         * @since 3.4.0
    559669         *
    560670         * @param $value
     671         * @return bool
    561672         */
    562673        public function update( $value ) {
    563674                remove_theme_mod( 'background_image_thumb' );
     675                return true;
    564676        }
    565677}
  • src/wp-includes/js/customize-preview.js

    diff --git src/wp-includes/js/customize-preview.js src/wp-includes/js/customize-preview.js
    index 1a82565..5c279d4 100644
     
    7474                        channel: api.settings.channel
    7575                });
    7676
    77                 preview.bind( 'settings', function( values ) {
    78                         $.each( values, function( id, value ) {
    79                                 if ( api.has( id ) )
     77                preview.bind( 'settings', function( settings ) {
     78
     79                        $.each( settings, function( id, setting ) {
     80                                var value = setting.value;
     81                                delete setting.value;
     82                                if ( api.has( id ) ) {
    8083                                        api( id ).set( value );
    81                                 else
    82                                         api.create( id, value );
     84                                } else {
     85                                        setting.id = id;
     86                                        api.create( id, value, setting ); // Note this is an api.Value, not an api.Setting
     87                                }
    8388                        });
    8489                });
    8590
    86                 preview.trigger( 'settings', api.settings.values );
    87 
     91                /**
     92                 * @todo Send an setting object instead of a key/value pair?
     93                 */
    8894                preview.bind( 'setting', function( args ) {
    8995                        var value;
    9096
     97                        // @todo Allow other args?
    9198                        args = args.slice();
    9299
    93                         if ( value = api( args.shift() ) )
     100                        if ( value = api( args.shift() ) ) {
    94101                                value.set.apply( value, args );
     102                        }
    95103                });
    96104
    97105                preview.bind( 'sync', function( events ) {
     
    101109                        preview.send( 'synced' );
    102110                });
    103111
    104         preview.bind( 'active', function() {
    105             if ( api.settings.nonce )
    106                 preview.send( 'nonce', api.settings.nonce );
    107         });
     112                preview.bind( 'active', function() {
     113                        if ( api.settings.nonce ) {
     114                                preview.send( 'nonce', api.settings.nonce );
     115                        }
     116                });
    108117
    109118                preview.send( 'ready', {
    110119                        activePanels: api.settings.activePanels,