Make WordPress Core

Ticket #43977: 43977.3.diff

File 43977.3.diff, 14.9 KB (added by david.binda, 6 years ago)
  • src/wp-includes/bookmark.php

    diff --git a/src/wp-includes/bookmark.php b/src/wp-includes/bookmark.php
    index b0de276..3249954 100644
    a b function get_bookmarks( $args = '' ) { 
    171171                $r['exclude']       = '';  //ignore exclude, category, and category_name params if using include
    172172                $r['category']      = '';
    173173                $r['category_name'] = '';
    174                 $inclinks           = preg_split( '/[\s,]+/', $r['include'] );
     174                $inclinks           = wp_parse_id_list( $r['include'] );
    175175                if ( count( $inclinks ) ) {
    176176                        foreach ( $inclinks as $inclink ) {
    177177                                if ( empty( $inclusions ) ) {
    178                                         $inclusions = ' AND ( link_id = ' . intval( $inclink ) . ' ';
     178                                        $inclusions = ' AND ( link_id = ' . $inclink . ' ';
    179179                                } else {
    180                                         $inclusions .= ' OR link_id = ' . intval( $inclink ) . ' ';
     180                                        $inclusions .= ' OR link_id = ' . $inclink . ' ';
    181181                                }
    182182                        }
    183183                }
    function get_bookmarks( $args = '' ) { 
    188188
    189189        $exclusions = '';
    190190        if ( ! empty( $r['exclude'] ) ) {
    191                 $exlinks = preg_split( '/[\s,]+/', $r['exclude'] );
     191                $exlinks = wp_parse_id_list( $r['exclude'] );
    192192                if ( count( $exlinks ) ) {
    193193                        foreach ( $exlinks as $exlink ) {
    194194                                if ( empty( $exclusions ) ) {
    195                                         $exclusions = ' AND ( link_id <> ' . intval( $exlink ) . ' ';
     195                                        $exclusions = ' AND ( link_id <> ' . $exlink . ' ';
    196196                                } else {
    197                                         $exclusions .= ' AND link_id <> ' . intval( $exlink ) . ' ';
     197                                        $exclusions .= ' AND link_id <> ' . $exlink . ' ';
    198198                                }
    199199                        }
    200200                }
    function get_bookmarks( $args = '' ) { 
    223223        $category_query = '';
    224224        $join           = '';
    225225        if ( ! empty( $r['category'] ) ) {
    226                 $incategories = preg_split( '/[\s,]+/', $r['category'] );
     226                $incategories = wp_parse_id_list( $r['category'] );
    227227                if ( count( $incategories ) ) {
    228228                        foreach ( $incategories as $incat ) {
    229229                                if ( empty( $category_query ) ) {
    230                                         $category_query = ' AND ( tt.term_id = ' . intval( $incat ) . ' ';
     230                                        $category_query = ' AND ( tt.term_id = ' . $incat . ' ';
    231231                                } else {
    232                                         $category_query .= ' OR tt.term_id = ' . intval( $incat ) . ' ';
     232                                        $category_query .= ' OR tt.term_id = ' . $incat . ' ';
    233233                                }
    234234                        }
    235235                }
  • src/wp-includes/class-wp-comment-query.php

    diff --git a/src/wp-includes/class-wp-comment-query.php b/src/wp-includes/class-wp-comment-query.php
    index d0e7cff..1f58c58 100644
    a b class WP_Comment_Query { 
    482482
    483483                // 'status' accepts an array or a comma-separated string.
    484484                $status_clauses = array();
    485                 $statuses       = $this->query_vars['status'];
    486                 if ( ! is_array( $statuses ) ) {
    487                         $statuses = preg_split( '/[\s,]+/', $statuses );
     485                $statuses       = wp_parse_list( $this->query_vars['status'] );
     486
     487                // Empty 'status' should be interpreted as 'all'.
     488                if ( empty( $statuses ) ) {
     489                        $statuses = array( 'all' );
    488490                }
    489491
    490492                // 'any' overrides other statuses.
    class WP_Comment_Query { 
    517519
    518520                // User IDs or emails whose unapproved comments are included, regardless of $status.
    519521                if ( ! empty( $this->query_vars['include_unapproved'] ) ) {
    520                         $include_unapproved = $this->query_vars['include_unapproved'];
    521 
    522                         // Accepts arrays or comma-separated strings.
    523                         if ( ! is_array( $include_unapproved ) ) {
    524                                 $include_unapproved = preg_split( '/[\s,]+/', $include_unapproved );
    525                         }
     522                        $include_unapproved = wp_parse_list( $this->query_vars['include_unapproved'] );
    526523
    527                         $unapproved_ids = $unapproved_emails = array();
     524                        $unapproved_ids    = array();
     525                        $unapproved_emails = array();
    528526                        foreach ( $include_unapproved as $unapproved_identifier ) {
    529527                                // Numeric values are assumed to be user ids.
    530528                                if ( is_numeric( $unapproved_identifier ) ) {
  • src/wp-includes/functions.php

    diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php
    index f307031..1d37930 100644
    a b function wp_parse_args( $args, $defaults = '' ) { 
    37483748}
    37493749
    37503750/**
     3751 * Cleans up an array, comma- or space-separated list of scalar values.
     3752 *
     3753 * @since 5.0.0
     3754 *
     3755 * @param array|string $list List of values.
     3756 * @return array Sanitized array of values.
     3757 */
     3758function wp_parse_list( $list ) {
     3759        if ( ! is_array( $list ) ) {
     3760                return preg_split( '/[\s,]+/', $list, -1, PREG_SPLIT_NO_EMPTY );
     3761        }
     3762
     3763        return $list;
     3764}
     3765
     3766/**
    37513767 * Clean up an array, comma- or space-separated list of IDs.
    37523768 *
    37533769 * @since 3.0.0
    function wp_parse_args( $args, $defaults = '' ) { 
    37563772 * @return array Sanitized array of IDs.
    37573773 */
    37583774function wp_parse_id_list( $list ) {
    3759         if ( ! is_array( $list ) ) {
    3760                 $list = preg_split( '/[\s,]+/', $list );
    3761         }
     3775        $list = wp_parse_list( $list );
    37623776
    37633777        return array_unique( array_map( 'absint', $list ) );
    37643778}
    function wp_parse_id_list( $list ) { 
    37723786 * @return array Sanitized array of slugs.
    37733787 */
    37743788function wp_parse_slug_list( $list ) {
    3775         if ( ! is_array( $list ) ) {
    3776                 $list = preg_split( '/[\s,]+/', $list );
    3777         }
    3778 
    3779         foreach ( $list as $key => $value ) {
    3780                 $list[ $key ] = sanitize_title( $value );
    3781         }
     3789        $list = wp_parse_list( $list );
    37823790
    3783         return array_unique( $list );
     3791        return array_unique( array_map( 'sanitize_title', $list ) );
    37843792}
    37853793
    37863794/**
  • src/wp-includes/post.php

    diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php
    index 7feb284..e220ee9 100644
    a b function get_pages( $args = array() ) { 
    50045004
    50055005        $author_query = '';
    50065006        if ( ! empty( $r['authors'] ) ) {
    5007                 $post_authors = preg_split( '/[\s,]+/', $r['authors'] );
     5007                $post_authors = wp_parse_list( $r['authors'] );
    50085008
    50095009                if ( ! empty( $post_authors ) ) {
    50105010                        foreach ( $post_authors as $post_author ) {
  • src/wp-includes/rest-api.php

    diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php
    index 0cce9fa..0feb681 100644
    a b function rest_filter_response_fields( $response, $server, $request ) { 
    651651
    652652        $data = $response->get_data();
    653653
    654         $fields = is_array( $request['_fields'] ) ? $request['_fields'] : preg_split( '/[\s,]+/', $request['_fields'] );
     654        $fields = wp_parse_list( $request['_fields'] );
    655655
    656656        if ( 0 === count( $fields ) ) {
    657657                return $response;
    function rest_get_avatar_sizes() { 
    10811081 */
    10821082function rest_validate_value_from_schema( $value, $args, $param = '' ) {
    10831083        if ( 'array' === $args['type'] ) {
    1084                 if ( ! is_array( $value ) ) {
    1085                         $value = preg_split( '/[\s,]+/', $value );
    1086                 }
     1084                $value = wp_parse_list( $value );
    10871085                if ( ! wp_is_numeric_array( $value ) ) {
    10881086                        /* translators: 1: parameter, 2: type name */
    10891087                        return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s is not of type %2$s.' ), $param, 'array' ) );
    function rest_sanitize_value_from_schema( $value, $args ) { 
    12251223                if ( empty( $args['items'] ) ) {
    12261224                        return (array) $value;
    12271225                }
    1228                 if ( ! is_array( $value ) ) {
    1229                         $value = preg_split( '/[\s,]+/', $value );
    1230                 }
     1226                $value = wp_parse_list( $value );
    12311227                foreach ( $value as $index => $v ) {
    12321228                        $value[ $index ] = rest_sanitize_value_from_schema( $v, $args['items'] );
    12331229                }
  • src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-controller.php
    index 1b73881..4c2c187 100644
    a b abstract class WP_REST_Controller { 
    521521                if ( ! isset( $request['_fields'] ) ) {
    522522                        return $fields;
    523523                }
    524                 $requested_fields = is_array( $request['_fields'] ) ? $request['_fields'] : preg_split( '/[\s,]+/', $request['_fields'] );
     524                $requested_fields = wp_parse_list( $request['_fields'] );
    525525                if ( 0 === count( $requested_fields ) ) {
    526526                        return $fields;
    527527                }
  • tests/phpunit/tests/bookmark/getBookmarks.php

    diff --git a/tests/phpunit/tests/bookmark/getBookmarks.php b/tests/phpunit/tests/bookmark/getBookmarks.php
    index 13f8795..c605a9f 100644
    a b class Tests_Bookmark_GetBookmarks extends WP_UnitTestCase { 
    8484                $this->assertEqualSets( $found1, $found2 );
    8585                $this->assertTrue( $num_queries < $wpdb->num_queries );
    8686        }
     87
     88        public function test_exclude_param_gets_properly_parsed_as_list() {
     89                $bookmarks = self::factory()->bookmark->create_many( 3 );
     90
     91                $found = get_bookmarks(
     92                        array(
     93                                'exclude' => ',,',
     94                        )
     95                );
     96                $found_ids = array();
     97                foreach( $found as $bookmark ) {
     98                        $found_ids[] = $bookmark->link_id;
     99                }
     100
     101                // equal sets != same order.
     102                $this->assertEqualSets( $bookmarks, $found_ids );
     103        }
     104
     105        public function test_include_param_gets_properly_parsed_as_list() {
     106                $bookmarks = self::factory()->bookmark->create_many( 3 );
     107
     108                $found = get_bookmarks(
     109                        array(
     110                                'include' => ',,',
     111                        )
     112                );
     113                $found_ids = array();
     114        foreach( $found as $bookmark ) {
     115            $found_ids[] = $bookmark->link_id;
     116        }
     117
     118                // equal sets != same order.
     119                $this->assertEqualSets( $bookmarks, $found_ids );
     120        }
     121
     122        public function test_category_param_propelry_gets_parsed_as_list() {
     123                $bookmarks = self::factory()->bookmark->create_many( 3 );
     124                $categories = self::factory()->term->create_many( 3, array(
     125                        'taxonomy' => 'link_category',
     126                ) );
     127                $add = wp_add_object_terms( $bookmarks[0], $categories[0], 'link_category' );
     128                $add = wp_add_object_terms( $bookmarks[1], $categories[1], 'link_category' );
     129                $add = wp_add_object_terms( $bookmarks[2], $categories[2], 'link_category' );
     130
     131                $found = get_bookmarks(
     132                        array(
     133                                'category' => ',,',
     134                        )
     135                );
     136                $found_ids = array();
     137        foreach( $found as $bookmark ) {
     138                        $found_ids[] = $bookmark->link_id;
     139        }
     140
     141                // equal sets != same order.
     142                $this->assertEqualSets( $bookmarks, $found_ids );
     143        }
    87144}
  • tests/phpunit/tests/functions.php

    diff --git a/tests/phpunit/tests/functions.php b/tests/phpunit/tests/functions.php
    index 2557f1f..a3491c8 100644
    a b class Tests_Functions extends WP_UnitTestCase { 
    573573        }
    574574
    575575        /**
     576         * @dataProvider data_wp_parse_list
     577         */
     578        function test_wp_parse_list( $expected, $actual ) {
     579                $this->assertSame( $expected, array_values( wp_parse_list( $actual ) ) );
     580        }
     581
     582        function data_wp_parse_list() {
     583                return array(
     584                        array( array( '1', '2', '3', '4' ), '1,2,3,4' ),
     585                        array( array( 'apple', 'banana', 'carrot', 'dog' ), 'apple,banana,carrot,dog' ),
     586                        array( array( '1', '2', 'apple', 'banana' ), '1,2,apple,banana' ),
     587                        array( array( '1', '2', 'apple', 'banana' ), '1, 2,apple,banana' ),
     588                        array( array( '1', '2', 'apple', 'banana' ), '1,2,apple,,banana' ),
     589                        array( array( '1', '2', 'apple', 'banana' ), ',1,2,apple,banana' ),
     590                        array( array( '1', '2', 'apple', 'banana' ), '1,2,apple,banana,' ),
     591                        array( array( '1', '2', 'apple', 'banana' ), '1,2 ,apple,banana' ),
     592                        array( array(), '' ),
     593                        array( array(), ',' ),
     594                        array( array(), ',,' ),
     595                );
     596        }
     597
     598        /**
    576599         * @dataProvider data_wp_parse_id_list
    577600         */
    578601        function test_wp_parse_id_list( $expected, $actual ) {
  • tests/phpunit/tests/rest-api/rest-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-controller.php b/tests/phpunit/tests/rest-api/rest-controller.php
    index 809ec17..02e6622 100644
    a b class WP_Test_REST_Controller extends WP_Test_REST_TestCase { 
    203203                $this->assertEquals( 'a', $args['somedefault']['default'] );
    204204        }
    205205
    206         public function test_get_fields_for_response() {
     206        /**
     207         * @dataProvider data_get_fields_for_response,
     208         */
     209        public function test_get_fields_for_response( $param, $expected ) {
    207210                $controller = new WP_REST_Test_Controller();
    208211                $request    = new WP_REST_Request( 'GET', '/wp/v2/testroute' );
    209212                $fields     = $controller->get_fields_for_response( $request );
    class WP_Test_REST_Controller extends WP_Test_REST_TestCase { 
    221224                        ),
    222225                        $fields
    223226                );
    224                 $request->set_param( '_fields', 'somestring,someinteger' );
     227                $request->set_param( '_fields', $param );
    225228                $fields = $controller->get_fields_for_response( $request );
    226                 $this->assertEquals(
     229                $this->assertEquals( $expected, $fields );
     230        }
     231
     232        public function data_get_fields_for_response() {
     233                return array(
    227234                        array(
    228                                 'somestring',
    229                                 'someinteger',
     235                                'somestring,someinteger',
     236                                array(
     237                                        'somestring',
     238                                        'someinteger',
     239                                ),
     240                        ),
     241                        array(
     242                                ',,',
     243                                array(
     244                                        'somestring',
     245                                        'someinteger',
     246                                        'someboolean',
     247                                        'someurl',
     248                                        'somedate',
     249                                        'someemail',
     250                                        'someenum',
     251                                        'someargoptions',
     252                                        'somedefault',
     253                                ),
    230254                        ),
    231                         $fields
    232255                );
    233256        }
    234257}
  • tests/phpunit/tests/rest-api/rest-schema-sanitization.php

    diff --git a/tests/phpunit/tests/rest-api/rest-schema-sanitization.php b/tests/phpunit/tests/rest-api/rest-schema-sanitization.php
    index b3a3a49..6dc0864 100644
    a b class WP_Test_REST_Schema_Sanitization extends WP_UnitTestCase { 
    110110                );
    111111                $this->assertEquals( array( 1, 2 ), rest_sanitize_value_from_schema( '1,2', $schema ) );
    112112                $this->assertEquals( array( 1, 2, 0 ), rest_sanitize_value_from_schema( '1,2,a', $schema ) );
     113                $this->assertEquals( array( 1, 2 ), rest_sanitize_value_from_schema( '1,2,', $schema ) );
    113114        }
    114115
    115116        public function test_type_array_with_enum() {
    class WP_Test_REST_Schema_Sanitization extends WP_UnitTestCase { 
    134135                );
    135136                $this->assertEquals( array( 'ribs', 'chicken' ), rest_sanitize_value_from_schema( 'ribs,chicken', $schema ) );
    136137                $this->assertEquals( array( 'chicken', 'coleslaw' ), rest_sanitize_value_from_schema( 'chicken,coleslaw', $schema ) );
     138                $this->assertEquals( array( 'chicken', 'coleslaw' ), rest_sanitize_value_from_schema( 'chicken,coleslaw,', $schema ) );
    137139        }
    138140
    139141        public function test_type_array_is_associative() {
  • tests/phpunit/tests/rest-api/rest-schema-validation.php

    diff --git a/tests/phpunit/tests/rest-api/rest-schema-validation.php b/tests/phpunit/tests/rest-api/rest-schema-validation.php
    index 5cd3177..81c71d2 100644
    a b class WP_Test_REST_Schema_Validation extends WP_UnitTestCase { 
    145145                $this->assertTrue( rest_validate_value_from_schema( '1', $schema ) );
    146146                $this->assertTrue( rest_validate_value_from_schema( '1,2,3', $schema ) );
    147147                $this->assertWPError( rest_validate_value_from_schema( 'lol', $schema ) );
     148                $this->assertTrue( rest_validate_value_from_schema( '1,,', $schema ) );
     149                $this->assertTrue( rest_validate_value_from_schema( '', $schema ) );
    148150        }
    149151
    150152        public function test_type_array_with_enum() {
    class WP_Test_REST_Schema_Validation extends WP_UnitTestCase { 
    169171                );
    170172                $this->assertTrue( rest_validate_value_from_schema( 'ribs,chicken', $schema ) );
    171173                $this->assertWPError( rest_validate_value_from_schema( 'chicken,coleslaw', $schema ) );
     174                $this->assertTrue( rest_validate_value_from_schema( 'ribs,chicken,', $schema ) );
     175                $this->assertTrue( rest_validate_value_from_schema( '', $schema ) );
    172176        }
    173177
    174178        public function test_type_array_is_associative() {