Make WordPress Core

Changeset 59892


Ignore:
Timestamp:
02/28/2025 06:19:21 PM (19 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.