Make WordPress Core

Changeset 59892


Ignore:
Timestamp:
02/28/2025 06:19:21 PM (2 months ago)
Author:
joemcgill
Message:

REST API: Add support for search_columns to the user endpoint.

This adds support for passing a search_columns argument to the user controller so that users with list_users caps can specify which field is being searched.

Props youknowriad, joemcgill, ntsekouras, mreishus, mamaduka.
Fixes 62596.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php

    r59754 r59892  
    258258     *
    259259     * @since 4.7.0
     260     * @since 6.8.0 Added support for the search_columns query param.
    260261     *
    261262     * @param WP_REST_Request $request Full details about the request.
     
    332333                $prepared_args['search_columns'] = array( 'ID', 'user_login', 'user_nicename', 'display_name' );
    333334            }
     335            $search_columns         = $request->get_param( 'search_columns' );
     336            $valid_columns          = isset( $prepared_args['search_columns'] )
     337                ? $prepared_args['search_columns']
     338                : array( 'ID', 'user_login', 'user_nicename', 'user_email', 'display_name' );
     339            $search_columns_mapping = array(
     340                'id'       => 'ID',
     341                'username' => 'user_login',
     342                'slug'     => 'user_nicename',
     343                'email'    => 'user_email',
     344                'name'     => 'display_name',
     345            );
     346            $search_columns         = array_map(
     347                static function ( $column ) use ( $search_columns_mapping ) {
     348                    return $search_columns_mapping[ $column ];
     349                },
     350                $search_columns
     351            );
     352            $search_columns         = array_intersect( $search_columns, $valid_columns );
     353            if ( ! empty( $search_columns ) ) {
     354                $prepared_args['search_columns'] = $search_columns;
     355            }
    334356            $prepared_args['search'] = '*' . $prepared_args['search'] . '*';
    335357        }
     
    16141636        );
    16151637
     1638        $query_params['search_columns'] = array(
     1639            'default'     => array(),
     1640            'description' => __( 'Array of column names to be searched.' ),
     1641            'type'        => 'array',
     1642            'items'       => array(
     1643                'enum' => array( 'email', 'name', 'id', 'username', 'slug' ),
     1644                'type' => 'string',
     1645            ),
     1646        );
     1647
    16161648        /**
    16171649         * Filters REST API collection parameters for the users controller.
  • trunk/tests/phpunit/tests/rest-api/rest-users-controller.php

    r58283 r59892  
    213213                'slug',
    214214                'who',
     215                'search_columns',
    215216                'has_published_posts',
    216217            ),
     
    709710
    710711        wp_set_current_user( self::$editor );
     712        $response = rest_get_server()->dispatch( $request );
     713        $this->assertCount( 0, $response->get_data() );
     714    }
     715
     716    /**
     717     * @ticket 62596
     718     */
     719    public function test_get_items_search_columns() {
     720        $request = new WP_REST_Request( 'GET', '/wp/v2/users' );
     721        $request->set_param( 'search', 'yololololo' );
     722        $response = rest_get_server()->dispatch( $request );
     723        $this->assertCount( 0, $response->get_data() );
     724
     725        self::factory()->user->create(
     726            array(
     727                'display_name' => 'Adam',
     728                'user_email'   => 'yololololo@example.localhost',
     729            )
     730        );
     731
     732        wp_set_current_user( self::$user );
     733        $request = new WP_REST_Request( 'GET', '/wp/v2/users' );
     734        $request->set_param( 'search', 'yololololo' );
     735        $request->set_param( 'search_columns', 'email' );
     736        $response = rest_get_server()->dispatch( $request );
     737        $this->assertCount( 1, $response->get_data() );
     738
     739        $request = new WP_REST_Request( 'GET', '/wp/v2/users' );
     740        $request->set_param( 'search', 'yololololo' );
     741        $request->set_param( 'search_columns', 'name' );
     742        $response = rest_get_server()->dispatch( $request );
     743        $this->assertCount( 0, $response->get_data() );
     744
     745        $request = new WP_REST_Request( 'GET', '/wp/v2/users' );
     746        $request->set_param( 'search', 'Adam' );
     747        $request->set_param( 'search_columns', 'name' );
     748        $response = rest_get_server()->dispatch( $request );
     749        $this->assertCount( 1, $response->get_data() );
     750    }
     751
     752    /**
     753     * @ticket 62596
     754     */
     755    public function test_get_items_search_columns_without_permission() {
     756        self::factory()->user->create(
     757            array(
     758                'display_name' => 'Adam',
     759                'user_email'   => 'yololololo@example.localhost',
     760            )
     761        );
     762
     763        // Test user without sufficient capabilities - 'list_users'.
     764        wp_set_current_user( self::$editor );
     765
     766        $request = new WP_REST_Request( 'GET', '/wp/v2/users' );
     767        $request->set_param( 'search', 'yololololo' );
     768        $request->set_param( 'search_columns', 'email' );
    711769        $response = rest_get_server()->dispatch( $request );
    712770        $this->assertCount( 0, $response->get_data() );
  • trunk/tests/qunit/fixtures/wp-api-generated.js

    r59880 r59892  
    96059605                            },
    96069606                            "required": false
     9607                        },
     9608                        "search_columns": {
     9609                            "default": [],
     9610                            "description": "Array of column names to be searched.",
     9611                            "type": "array",
     9612                            "items": {
     9613                                "enum": [
     9614                                    "email",
     9615                                    "name",
     9616                                    "id",
     9617                                    "username",
     9618                                    "slug"
     9619                                ],
     9620                                "type": "string"
     9621                            },
     9622                            "required": false
    96079623                        }
    96089624                    }
Note: See TracChangeset for help on using the changeset viewer.