Make WordPress Core

Changeset 53255


Ignore:
Timestamp:
04/25/2022 12:55:35 PM (4 years ago)
Author:
audrasjb
Message:

Users: Make sure WP_User_Query can be filtered using the fields parameter.

This change ensures the fields parameter is taken into account when running WP_User_Query by fixing the conditional statement used to process the fields param.

Props rilwis, peterwilsoncc, NomNom99, hellofromTonya, audrasjb, rilwis, Boniu91.
Fixes #53177.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-user-query.php

    r52977 r53255  
    275275                $qv = $this->fill_query_vars( $qv );
    276276
     277                $allowed_fields = array(
     278                        'ID',
     279                        'display_name',
     280                        'user_login',
     281                        'user_nicename',
     282                        'user_email',
     283                        'user_url',
     284                        'user_registered',
     285                );
     286
    277287                if ( is_array( $qv['fields'] ) ) {
    278288                        $qv['fields'] = array_unique( $qv['fields'] );
     
    284294                        }
    285295                        $this->query_fields = implode( ',', $this->query_fields );
    286                 } elseif ( 'all' === $qv['fields'] ) {
     296                } elseif ( ! in_array( $qv['fields'], $allowed_fields, true ) ) {
    287297                        $this->query_fields = "$wpdb->users.*";
    288298                } else {
    289                         $this->query_fields = "$wpdb->users.ID";
     299                        $field              = 'ID' === $qv['fields'] ? 'ID' : sanitize_key( $qv['fields'] );
     300                        $this->query_fields = "$wpdb->users.$field";
    290301                }
    291302
  • trunk/tests/phpunit/tests/user/query.php

    r52010 r53255  
    199199                                'meta_key' => 'last_name',
    200200                                'orderby'  => 'meta_value',
    201                                 'fields'   => 'ids',
     201                                'fields'   => 'ID',
    202202                        )
    203203                );
     
    221221                                'meta_key' => 'user_age',
    222222                                'orderby'  => 'meta_value_num',
    223                                 'fields'   => 'ids',
     223                                'fields'   => 'ID',
    224224                        )
    225225                );
     
    243243                                'meta_key' => 'foo',
    244244                                'orderby'  => 'foo',
    245                                 'fields'   => 'ids',
     245                                'fields'   => 'ID',
    246246                        )
    247247                );
     
    262262                $q = new WP_User_Query(
    263263                        array(
    264                                 'fields'     => 'ids',
     264                                'fields'     => 'ID',
    265265                                'meta_query' => array(
    266266                                        'foo_key' => array(
     
    303303                $q = new WP_User_Query(
    304304                        array(
    305                                 'fields'     => 'ids',
     305                                'fields'     => 'ID',
    306306                                'meta_query' => array(
    307307                                        'foo_key' => array(
     
    333333                $q = new WP_User_Query(
    334334                        array(
    335                                 'fields'     => 'ids',
     335                                'fields'     => 'ID',
    336336                                'meta_query' => array(
    337337                                        'foo_key' => array(
     
    12821282                                'orderby' => 'ID',
    12831283                                'order'   => 'DESC', // Avoid funkiness with user 1.
    1284                                 'fields'  => 'ids',
     1284                                'fields'  => 'ID',
    12851285                        )
    12861286                );
     
    13581358                        array(
    13591359                                'role'   => 'editor',
    1360                                 'fields' => 'ids',
     1360                                'fields' => 'ID',
    13611361                        )
    13621362                );
     
    19671967                $this->assertContains( self::$author_ids[2], $found );
    19681968        }
     1969
     1970        /**
     1971         * @ticket 53177
     1972         *
     1973         * @param $field
     1974         * @param $expected
     1975         *
     1976         * @return void
     1977         *
     1978         * @dataProvider data_returning_fields
     1979         *
     1980         * @covers WP_User_Query::prepare_query
     1981         */
     1982        public function test_returning_fields( $field, $expected_values ) {
     1983                $q       = new WP_User_Query(
     1984                        array(
     1985                                'fields'   => $field,
     1986                                'include ' => array( self::$admin_ids[0] ),
     1987                        )
     1988                );
     1989                $results = $q->get_results();
     1990
     1991                if ( 'all_with_meta' === $field ) {
     1992                        $data = array_shift( $results )->data;
     1993
     1994                } else {
     1995                        $data = ( isset( $results[0]->data ) ) ? $results[0]->data : $results[0];
     1996                }
     1997
     1998                foreach ( $expected_values as $key => $expected_value ) {
     1999                        if ( ! is_array( $results ) ) {
     2000                                $this->assertEquals( array_shift( $results ), $expected_value );
     2001                        } else {
     2002                                $value = ( isset( $data->$key ) ) ? $data->$key : $data;
     2003                                $this->assertEquals( $value, $expected_value );
     2004                        }
     2005                }
     2006        }
     2007
     2008        public function data_returning_fields() {
     2009                return array(
     2010                        'all'           => array(
     2011                                'field'    => 'all',
     2012                                'expected' => array(
     2013                                        'ID'                  => '1',
     2014                                        'user_login'          => 'admin',
     2015                                        'user_nicename'       => 'admin',
     2016                                        'user_email'          => 'admin@example.org',
     2017                                        'user_url'            => 'http://example.org',
     2018                                        'user_activation_key' => '',
     2019                                        'user_status'         => '0',
     2020                                        'display_name'        => 'admin',
     2021                                ),
     2022                        ),
     2023                        'all_with_meta' => array(
     2024                                'field'    => 'all_with_meta',
     2025                                'expected' => array(
     2026                                        'ID'                  => '1',
     2027                                        'user_login'          => 'admin',
     2028                                        'user_nicename'       => 'admin',
     2029                                        'user_email'          => 'admin@example.org',
     2030                                        'user_url'            => 'http://example.org',
     2031                                        'user_activation_key' => '',
     2032                                        'user_status'         => '0',
     2033                                        'display_name'        => 'admin',
     2034                                ),
     2035                        ),
     2036                        'ID'            => array(
     2037                                'field'    => 'ID',
     2038                                'expected' => array(
     2039                                        'ID' => '1',
     2040                                ),
     2041                        ),
     2042                        'display_name'  => array(
     2043                                'field'    => 'display_name',
     2044                                'expected' => array(
     2045                                        'display_name' => 'admin',
     2046                                ),
     2047                        ),
     2048                        'user_login'    => array(
     2049                                'field'    => 'user_login',
     2050                                'expected' => array(
     2051                                        'user_login' => 'admin',
     2052                                ),
     2053                        ),
     2054                        'user_nicename' => array(
     2055                                'field'    => 'user_nicename',
     2056                                'expected' => array(
     2057                                        'user_nicename' => 'admin',
     2058                                ),
     2059                        ),
     2060                        'user_email'    => array(
     2061                                'field'    => 'user_email',
     2062                                'expected' => array(
     2063                                        'user_email' => 'admin@example.org',
     2064                                ),
     2065                        ),
     2066                        'invalid_field' => array(
     2067                                'field'    => 'invalid_field',
     2068                                'expected' => array(
     2069                                        '0' => '1',
     2070                                ),
     2071                        ),
     2072                );
     2073        }
     2074
     2075        /**
     2076         * @ticket 53177
     2077         *
     2078         * @return void
     2079         *
     2080         * @covers WP_User_Query::prepare_query
     2081         */
     2082        public function test_returning_field_user_registered() {
     2083                $q       = new WP_User_Query(
     2084                        array(
     2085                                'fields'  => 'user_registered',
     2086                                'include' => array( self::$admin_ids[0] ),
     2087                        )
     2088                );
     2089                $results = $q->get_results();
     2090                $this->assertNotFalse( DateTime::createFromFormat( 'Y-m-d H:i:s', $results[0] ) );
     2091        }
    19692092}
Note: See TracChangeset for help on using the changeset viewer.