Make WordPress Core

Changeset 53362


Ignore:
Timestamp:
05/07/2022 03:30:51 AM (4 years ago)
Author:
peterwilsoncc
Message:

Users: Allow any DB field to be returned by WP_User_Query.

Restore behaviour of fields parameter in WP_User_Query to allow developers to specify any database field to be returned either individually or as part of a subset. Add these fields to the documentation.

When a subset of fields includes the id paramater, include it in the results in both upper and lowercase to maintain backward compatibility.

Follow up to [53327].

Props dd32, pbearne, kraftbj, peterwilsoncc.
Fixes #53177.

Location:
trunk
Files:
2 edited

Legend:

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

    r53327 r53362  
    231231         *                                                - 'user_url'
    232232         *                                                - 'user_registered'
     233         *                                                - 'user_pass'
     234         *                                                - 'user_activation_key'
     235         *                                                - 'user_status'
     236         *                                                - 'spam' (only available on multisite installs)
     237         *                                                - 'deleted' (only available on multisite installs)
    233238         *                                                - 'all' for all fields
    234239         *                                                - 'all_with_meta' to include meta fields.
     
    276281
    277282                $allowed_fields = array(
    278                         'ID',
    279                         'display_name',
     283                        'id',
    280284                        'user_login',
     285                        'user_pass',
    281286                        'user_nicename',
    282287                        'user_email',
    283288                        'user_url',
    284289                        'user_registered',
     290                        'user_activation_key',
     291                        'user_status',
     292                        'display_name',
    285293                );
     294                if ( is_multisite() ) {
     295                        $allowed_fields[] = 'spam';
     296                        $allowed_fields[] = 'deleted';
     297                }
    286298
    287299                if ( is_array( $qv['fields'] ) ) {
     300                        $qv['fields'] = array_map( 'strtolower', $qv['fields'] );
    288301                        $qv['fields'] = array_intersect( array_unique( $qv['fields'] ), $allowed_fields );
    289302
    290303                        if ( empty( $qv['fields'] ) ) {
    291                                 $qv['fields'] = array( 'ID' );
     304                                $qv['fields'] = array( 'id' );
    292305                        }
    293306
    294307                        $this->query_fields = array();
    295308                        foreach ( $qv['fields'] as $field ) {
    296                                 $field                = 'ID' === $field ? 'ID' : sanitize_key( $field );
     309                                $field                = 'id' === $field ? 'ID' : sanitize_key( $field );
    297310                                $this->query_fields[] = "$wpdb->users.$field";
    298311                        }
     
    303316                        $this->query_fields = "$wpdb->users.ID";
    304317                } else {
    305                         $field              = 'ID' === $qv['fields'] ? 'ID' : sanitize_key( $qv['fields'] );
     318                        $field              = 'id' === strtolower( $qv['fields'] ) ? 'ID' : sanitize_key( $qv['fields'] );
    306319                        $this->query_fields = "$wpdb->users.$field";
    307320                }
     
    823836                        return;
    824837                }
    825 
    826                 if ( 'all_with_meta' === $qv['fields'] ) {
     838                if (
     839                        is_array( $qv['fields'] ) &&
     840                        isset( $this->results[0]->ID )
     841                ) {
     842                        foreach ( $this->results as $result ) {
     843                                $result->id = $result->ID;
     844                        }
     845                } elseif ( 'all_with_meta' === $qv['fields'] ) {
    827846                        cache_users( $this->results );
    828847
  • trunk/tests/phpunit/tests/user/query.php

    r53331 r53362  
    19701970        /**
    19711971         * @ticket 53177
    1972          * @dataProvider data_returning_fields
     1972         * @dataProvider data_returning_field_subset_as_string
    19731973         *
    1974          * @covers WP_User_Query::prepare_query
    1975          *
    1976          * @param $field
    1977          * @param $expected
    1978          */
    1979         public function test_returning_fields( $field, $expected_values ) {
     1974         * @param string $field
     1975         * @param mixed $expected
     1976         */
     1977        public function test_returning_field_subset_as_string( $field, $expected ) {
    19801978                $q       = new WP_User_Query(
    19811979                        array(
     
    19861984                $results = $q->get_results();
    19871985
    1988                 if ( 'all_with_meta' === $field ) {
    1989                         $data = array_shift( $results )->data;
    1990 
    1991                 } else {
    1992                         $data = ( isset( $results[0]->data ) ) ? $results[0]->data : $results[0];
    1993                 }
    1994 
    1995                 foreach ( $expected_values as $key => $expected_value ) {
    1996                         if ( ! is_array( $results ) ) {
    1997                                 $this->assertEquals( array_shift( $results ), $expected_value );
    1998                         } else {
    1999                                 $value = ( isset( $data->$key ) ) ? $data->$key : $data;
    2000                                 $this->assertEquals( $value, $expected_value );
    2001                         }
    2002                 }
    2003         }
    2004 
    2005         public function data_returning_fields() {
    2006                 return array(
    2007                         'all'             => array(
    2008                                 'field'    => 'all',
     1986                $this->assertSameSets( $expected, $results );
     1987        }
     1988
     1989        /**
     1990         * Data provider
     1991         *
     1992         * @return array
     1993         */
     1994        function data_returning_field_subset_as_string() {
     1995                $data = array(
     1996                        'id'            => array(
     1997                                'fields'   => 'id',
     1998                                'expected' => array( '1' ),
     1999                        ),
     2000                        'ID'            => array(
     2001                                'fields'   => 'ID',
     2002                                'expected' => array( '1' ),
     2003                        ),
     2004                        'user_login'    => array(
     2005                                'fields'   => 'user_login',
     2006                                'expected' => array( 'admin' ),
     2007                        ),
     2008                        'user_nicename' => array(
     2009                                'fields'   => 'user_nicename',
     2010                                'expected' => array( 'admin' ),
     2011                        ),
     2012                        'user_email'    => array(
     2013                                'fields'   => 'user_email',
     2014                                'expected' => array( WP_TESTS_EMAIL ),
     2015                        ),
     2016                        'user_url'      => array(
     2017                                'fields'   => 'user_url',
     2018                                'expected' => array( wp_guess_url() ),
     2019                        ),
     2020                        'user_status'   => array(
     2021                                'fields'   => 'user_status',
     2022                                'expected' => array( '0' ),
     2023                        ),
     2024                        'display_name'  => array(
     2025                                'fields'   => 'display_name',
     2026                                'expected' => array( 'admin' ),
     2027                        ),
     2028                        'invalid_field' => array(
     2029                                'fields'   => 'invalid_field',
     2030                                'expected' => array( '1' ),
     2031                        ),
     2032                );
     2033
     2034                if ( is_multisite() ) {
     2035                        $data['spam']    = array(
     2036                                'fields'   => 'spam',
     2037                                'expected' => array( '0' ),
     2038                        );
     2039                        $data['deleted'] = array(
     2040                                'fields'   => 'deleted',
     2041                                'expected' => array( '0' ),
     2042                        );
     2043                }
     2044
     2045                return $data;
     2046        }
     2047
     2048        /**
     2049         * @ticket 53177
     2050         * @dataProvider data_returning_field_subset_as_array
     2051         *
     2052         * @param array $field
     2053         * @param mixed $expected
     2054         */
     2055        public function test_returning_field_subset_as_array( $field, $expected ) {
     2056                $q       = new WP_User_Query(
     2057                        array(
     2058                                'fields'  => $field,
     2059                                'include' => array( '1' ),
     2060                        )
     2061                );
     2062                $results = $q->get_results();
     2063
     2064                if ( isset( $results[0] ) && is_object( $results[0] ) ) {
     2065                        $results = (array) $results[0];
     2066                }
     2067
     2068                $this->assertSameSetsWithIndex( $expected, $results );
     2069        }
     2070
     2071        /**
     2072         * Data provider
     2073         *
     2074         * @return array
     2075         */
     2076        function data_returning_field_subset_as_array() {
     2077                $data = array(
     2078                        'id'                 => array(
     2079                                'fields'   => array( 'id' ),
    20092080                                'expected' => array(
    2010                                         'ID'                  => '1',
    2011                                         'user_login'          => 'admin',
    2012                                         'user_nicename'       => 'admin',
    2013                                         'user_email'          => WP_TESTS_EMAIL,
    2014                                         'user_url'            => wp_guess_url(),
    2015                                         'user_activation_key' => '',
    2016                                         'user_status'         => '0',
    2017                                         'display_name'        => 'admin',
    2018                                 ),
    2019                         ),
    2020                         'all_with_meta'   => array(
    2021                                 'field'    => 'all_with_meta',
    2022                                 'expected' => array(
    2023                                         'ID'                  => '1',
    2024                                         'user_login'          => 'admin',
    2025                                         'user_nicename'       => 'admin',
    2026                                         'user_email'          => WP_TESTS_EMAIL,
    2027                                         'user_url'            => wp_guess_url(),
    2028                                         'user_activation_key' => '',
    2029                                         'user_status'         => '0',
    2030                                         'display_name'        => 'admin',
    2031                                 ),
    2032                         ),
    2033                         'ID'              => array(
    2034                                 'field'    => 'ID',
    2035                                 'expected' => array(
     2081                                        'id' => '1',
    20362082                                        'ID' => '1',
    20372083                                ),
    20382084                        ),
    2039                         'id'              => array(
    2040                                 'field'    => 'id',
     2085                        'ID'                 => array(
     2086                                'fields'   => array( 'ID' ),
    20412087                                'expected' => array(
    20422088                                        'ID' => '1',
     2089                                        'id' => '1',
    20432090                                ),
    20442091                        ),
    2045                         'display_name'    => array(
    2046                                 'field'    => 'display_name',
     2092                        'user_login'         => array(
     2093                                'fields'   => array( 'user_login' ),
     2094                                'expected' => array( 'user_login' => 'admin' ),
     2095                        ),
     2096                        'user_nicename'      => array(
     2097                                'fields'   => array( 'user_nicename' ),
     2098                                'expected' => array( 'user_nicename' => 'admin' ),
     2099                        ),
     2100                        'user_email'         => array(
     2101                                'fields'   => array( 'user_email' ),
     2102                                'expected' => array( 'user_email' => WP_TESTS_EMAIL ),
     2103                        ),
     2104                        'user_url'           => array(
     2105                                'fields'   => array( 'user_url' ),
     2106                                'expected' => array( 'user_url' => wp_guess_url() ),
     2107                        ),
     2108                        'user_status'        => array(
     2109                                'fields'   => array( 'user_status' ),
     2110                                'expected' => array( 'user_status' => '0' ),
     2111                        ),
     2112                        'display_name'       => array(
     2113                                'fields'   => array( 'display_name' ),
     2114                                'expected' => array( 'display_name' => 'admin' ),
     2115                        ),
     2116                        'invalid_field'      => array(
     2117                                'fields'   => array( 'invalid_field' ),
     2118                                'expected' => array(
     2119                                        'ID' => '1',
     2120                                        'id' => '1',
     2121                                ),
     2122                        ),
     2123                        'valid array inc id' => array(
     2124                                'fields'   => array( 'display_name', 'user_email', 'id' ),
    20472125                                'expected' => array(
    20482126                                        'display_name' => 'admin',
     2127                                        'user_email'   => WP_TESTS_EMAIL,
     2128                                        'id'           => '1',
     2129                                        'ID'           => '1',
    20492130                                ),
    20502131                        ),
    2051                         'user_login'      => array(
    2052                                 'field'    => 'user_login',
     2132                        'valid array inc ID' => array(
     2133                                'fields'   => array( 'display_name', 'user_email', 'ID' ),
    20532134                                'expected' => array(
    2054                                         'user_login' => 'admin',
     2135                                        'display_name' => 'admin',
     2136                                        'user_email'   => WP_TESTS_EMAIL,
     2137                                        'id'           => '1',
     2138                                        'ID'           => '1',
    20552139                                ),
    20562140                        ),
    2057                         'user_nicename'   => array(
    2058                                 'field'    => 'user_nicename',
    2059                                 'expected' => array(
    2060                                         'user_nicename' => 'admin',
    2061                                 ),
     2141                        'partly valid array' => array(
     2142                                'fields'   => array( 'display_name', 'invalid_field' ),
     2143                                'expected' => array( 'display_name' => 'admin' ),
    20622144                        ),
    2063                         'user_email'      => array(
    2064                                 'field'    => 'user_email',
    2065                                 'expected' => array(
    2066                                         'user_email' => WP_TESTS_EMAIL,
    2067                                 ),
    2068                         ),
    2069                         'invalid_field'   => array(
    2070                                 'field'    => 'invalid_field',
    2071                                 'expected' => array(
    2072                                         '0' => '1',
    2073                                 ),
    2074                         ),
    2075                         'valid_array'     => array(
    2076                                 'field'    => array( 'ID', 'display_name' ),
    2077                                 'expected' => array(
    2078                                         'ID'           => '1',
    2079                                         'display_name' => 'admin',
    2080                                 ),
    2081                         ),
    2082                         'semivalid_array' => array(
    2083                                 'field'    => array( 'ID', 'display_name', 'invalid_field' ),
    2084                                 'expected' => array(
    2085                                         'ID'           => '1',
    2086                                         'display_name' => 'admin',
    2087                                 ),
    2088                         ),
    2089                         'invalid_array'   => array(
    2090                                 'field'    => array( 'invalid_field' ),
    2091                                 'expected' => array(
    2092                                         'ID' => '1',
    2093                                 ),
    2094                         ),
    2095                 );
     2145                );
     2146
     2147                if ( is_multisite() ) {
     2148                        $data['spam']    = array(
     2149                                'fields'   => array( 'spam' ),
     2150                                'expected' => array( 'spam' => '0' ),
     2151                        );
     2152                        $data['deleted'] = array(
     2153                                'fields'   => array( 'deleted' ),
     2154                                'expected' => array( 'deleted' => '0' ),
     2155                        );
     2156                }
     2157
     2158                return $data;
     2159        }
     2160
     2161        /**
     2162         * @ticket 53177
     2163         */
     2164        public function test_returning_field_all() {
     2165                $q         = new WP_User_Query(
     2166                        array(
     2167                                'fields'  => 'all',
     2168                                'include' => array( '1' ),
     2169                        )
     2170                );
     2171                $results   = $q->get_results();
     2172                $user_data = (array) $results[0]->data;
     2173
     2174                $expected_results = array(
     2175                        'ID'                  => '1',
     2176                        'user_login'          => 'admin',
     2177                        'user_nicename'       => 'admin',
     2178                        'user_url'            => wp_guess_url(),
     2179                        'user_email'          => WP_TESTS_EMAIL,
     2180                        'user_activation_key' => '',
     2181                        'user_status'         => '0',
     2182                        'display_name'        => 'admin',
     2183                );
     2184
     2185                if ( is_multisite() ) {
     2186                        $expected_results['spam']    = '0';
     2187                        $expected_results['deleted'] = '0';
     2188                }
     2189
     2190                // These change for each run.
     2191                unset( $user_data['user_pass'], $user_data['user_registered'] );
     2192
     2193                $this->assertSameSetsWithIndex( $expected_results, $user_data );
     2194                $this->assertInstanceOf( 'WP_User', $results[0] );
    20962195        }
    20972196
Note: See TracChangeset for help on using the changeset viewer.