Make WordPress Core

Ticket #33499: 33499.4.diff

File 33499.4.diff, 4.1 KB (added by westonruter, 9 years ago)
  • 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 65fa2e2..902c87d 100644
    class WP_Customize_Setting { 
    143143                if ( 'option' === $this->type || 'theme_mod' === $this->type ) {
    144144                        // Other setting types can opt-in to aggregate multidimensional explicitly.
    145145                        $this->aggregate_multidimensional();
     146
     147                        // Allow option settings to indicate whether they should be autoloaded.
     148                        if ( 'option' === $this->type && isset( $args['autoload'] ) ) {
     149                                self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] = $args['autoload'];
     150                        }
    146151                }
    147152        }
    148153
    class WP_Customize_Setting { 
    502507        protected function set_root_value( $value ) {
    503508                $id_base = $this->id_data['base'];
    504509                if ( 'option' === $this->type ) {
    505                         return update_option( $id_base, $value );
     510                        $autoload = true;
     511                        if ( isset( self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] ) ) {
     512                                $autoload = self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'];
     513                        }
     514                        return update_option( $id_base, $value, $autoload );
    506515                } else if ( 'theme_mod' ) {
    507516                        set_theme_mod( $id_base, $value );
    508517                        return true;
  • tests/phpunit/tests/customize/setting.php

    diff --git tests/phpunit/tests/customize/setting.php tests/phpunit/tests/customize/setting.php
    index 296554b..da789b1 100644
    class Tests_WP_Customize_Setting extends WP_UnitTestCase { 
    472472                $this->assertNotEquals( $post_value, get_option( $name ) );
    473473                restore_current_blog();
    474474        }
     475
     476        /**
     477         * @ticket 33499
     478         */
     479        function test_option_autoloading() {
     480                global $wpdb;
     481                wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
     482
     483                $name = 'autoloaded1';
     484                $setting = new WP_Customize_Setting( $this->manager, $name, array(
     485                        'type' => 'option',
     486                ) );
     487                $value = 'value1';
     488                $this->manager->set_post_value( $setting->id, $value );
     489                $setting->save();
     490                $autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $setting->id ) );
     491                $this->assertEquals( 'yes', $autoload );
     492                $this->assertEquals( $value, get_option( $name ) );
     493
     494                $name = 'autoloaded2';
     495                $setting = new WP_Customize_Setting( $this->manager, $name, array(
     496                        'type' => 'option',
     497                        'autoload' => true,
     498                ) );
     499                $value = 'value2';
     500                $this->manager->set_post_value( $setting->id, $value );
     501                $setting->save();
     502                $autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $setting->id ) );
     503                $this->assertEquals( 'yes', $autoload );
     504                $this->assertEquals( $value, get_option( $name ) );
     505
     506                $name = 'not-autoloaded1';
     507                $setting = new WP_Customize_Setting( $this->manager, $name, array(
     508                        'type' => 'option',
     509                        'autoload' => false,
     510                ) );
     511                $value = 'value3';
     512                $this->manager->set_post_value( $setting->id, $value );
     513                $setting->save();
     514                $autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $setting->id ) );
     515                $this->assertEquals( 'no', $autoload );
     516                $this->assertEquals( $value, get_option( $name ) );
     517
     518                $id_base = 'multi-not-autoloaded';
     519                $setting1 = new WP_Customize_Setting( $this->manager, $id_base . '[foo]', array(
     520                        'type' => 'option',
     521                ) );
     522                $setting2 = new WP_Customize_Setting( $this->manager, $id_base . '[bar]', array(
     523                        'type' => 'option',
     524                        'autoload' => false,
     525                ) );
     526                $this->manager->set_post_value( $setting1->id, 'value1' );
     527                $this->manager->set_post_value( $setting2->id, 'value2' );
     528                $setting1->save();
     529                $autoload = $wpdb->get_var( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $id_base ) );
     530                $this->assertEquals( 'no', $autoload, 'Even though setting1 did not indicate autoload (thus normally true), since another multidimensional option setting of the base did say autoload=false, it should be autoload=no' );
     531        }
    475532}
    476533