WordPress.org

Make WordPress Core

Ticket #37247: 37247.0.5.diff

File 37247.0.5.diff, 4.5 KB (added by schlessera, 5 years ago)

@westonruter 's fix + additional tests

  • 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 60b07a8..761e321 100644
    final class WP_Customize_Manager { 
    670670                if ( ! array_key_exists( $setting->id, $post_values ) ) {
    671671                        return $default;
    672672                }
    673                 $value = $setting->sanitize( $post_values[ $setting->id ] );
    674                 if ( is_null( $value ) || is_wp_error( $value ) ) {
    675                         return $default;
    676                 }
     673                $value = $post_values[ $setting->id ];
    677674                $valid = $setting->validate( $value );
    678675                if ( is_wp_error( $valid ) ) {
    679676                        return $default;
    680677                }
     678                $value = $setting->sanitize( $value );
     679                if ( is_null( $value ) || is_wp_error( $value ) ) {
     680                        return $default;
     681                }
    681682                return $value;
    682683        }
    683684
    final class WP_Customize_Manager { 
    10071008                        if ( ! $setting || is_null( $unsanitized_value ) ) {
    10081009                                continue;
    10091010                        }
    1010                         $validity = $setting->validate( $setting->sanitize( $unsanitized_value ) );
    1011                         if ( false === $validity || null === $validity ) {
     1011                        $validity = $setting->validate( $unsanitized_value );
     1012                        if ( ! is_wp_error( $validity ) ) {
     1013                                $value = $setting->sanitize( $unsanitized_value );
     1014                                if ( is_null( $value ) ) {
     1015                                        $validity = false;
     1016                                } elseif ( is_wp_error( $value ) ) {
     1017                                        $validity = $value;
     1018                                }
     1019                        }
     1020                        if ( false === $validity ) {
    10121021                                $validity = new WP_Error( 'invalid_value', __( 'Invalid value.' ) );
    10131022                        }
    10141023                        $validities[ $setting_id ] = $validity;
  • tests/phpunit/tests/customize/manager.php

    diff --git tests/phpunit/tests/customize/manager.php tests/phpunit/tests/customize/manager.php
    index 437f410..011bd8d 100644
    class Tests_WP_Customize_Manager extends WP_UnitTestCase { 
    190190                return $validity;
    191191        }
    192192
     193        /**
     194         * Test the WP_Customize_Manager::post_value() method to make sure that the validation and sanitization are done in the right order.
     195         *
     196         * @ticket 37247
     197         */
     198        function test_post_value_validation_sanitization_order() {
     199                $default_value = '0';
     200                $setting = $this->manager->add_setting( 'numeric', array(
     201                        'validate_callback' => array( $this, 'filter_customize_validate_numeric' ),
     202                        'sanitize_callback' => array( $this, 'filter_customize_sanitize_numeric' ),
     203                ) );
     204                $this->assertEquals( $default_value, $this->manager->post_value( $setting, $default_value ) );
     205                $this->assertEquals( $default_value, $setting->post_value( $default_value ) );
     206
     207                $post_value = '42';
     208                $this->manager->set_post_value( 'numeric', $post_value );
     209                $this->assertEquals( $post_value, $this->manager->post_value( $setting, $default_value ) );
     210                $this->assertEquals( $post_value, $setting->post_value( $default_value ) );
     211        }
     212
     213        /**
     214         * Filter customize_validate callback for a numeric value.
     215         *
     216         * @param mixed $value Value.
     217         * @return string|WP_Error
     218         */
     219        function filter_customize_sanitize_numeric( $value ) {
     220                return absint( $value );
     221        }
     222
     223        /**
     224         * Filter customize_validate callback for a numeric value.
     225         *
     226         * @param WP_Error $validity Validity.
     227         * @param mixed    $value    Value.
     228         * @return WP_Error
     229         */
     230        function filter_customize_validate_numeric( $validity, $value ) {
     231                if ( ! is_string( $value ) || ! is_numeric( $value ) ) {
     232                        $validity->add( 'invalid_value_in_validate', __( 'Invalid value.' ), array( 'source' => 'filter_customize_validate_numeric' ) );
     233                }
     234                return $validity;
     235        }
     236
    193237        /**
    194238         * Test WP_Customize_Manager::validate_setting_values().
    195239         *
    class Tests_WP_Customize_Manager extends WP_UnitTestCase { 
    234278                $this->assertEquals( array( 'source' => 'filter_customize_validate_foo' ), $error->get_error_data() );
    235279        }
    236280
     281        /**
     282         * Test the WP_Customize_Manager::validate_setting_values() method to make sure that the validation and sanitization are done in the right order.
     283         *
     284         * @ticket 37247
     285         */
     286        function test_validate_setting_values_validation_sanitization_order() {
     287                $setting = $this->manager->add_setting( 'numeric', array(
     288                        'validate_callback' => array( $this, 'filter_customize_validate_numeric' ),
     289                        'sanitize_callback' => array( $this, 'filter_customize_sanitize_numeric' ),
     290                ) );
     291                $post_value = '42';
     292                $this->manager->set_post_value( 'numeric', $post_value );
     293                $validities = $this->manager->validate_setting_values( $this->manager->unsanitized_post_values() );
     294                $this->assertCount( 1, $validities );
     295                $this->assertEquals( array( 'numeric' => true ), $validities );
     296        }
     297
    237298        /**
    238299         * Test WP_Customize_Manager::prepare_setting_validity_for_js().
    239300         *