| @@ -8,15 +8,15 @@ | ||
| 8 | 8 | if ( ! defined( 'ABSPATH' ) ) { |
| 9 | 9 | exit; // Exit if accessed directly. |
| 10 | 10 | } |
| 11 | 11 | |
| 12 | -/** | |
| 13 | - * @deprecated Use wp/v2/users instead. This endpoint proxies to wp/v2/users internally | |
| 14 | - * and will be removed in 4.6.0 version. | |
| 15 | - */ | |
| 16 | 12 | class User_Query extends Base { |
| 17 | 13 | const ENDPOINT = 'user'; |
| 18 | - | |
| 14 | + const SEARCH_FILTER_ACCEPTED_ARGS = 1; | |
| 15 | + /** | |
| 16 | + * @param \WP_REST_Request $request | |
| 17 | + * @return \WP_REST_Response | |
| 18 | + */ | |
| 19 | 19 | protected function get( \WP_REST_Request $request ) { |
| 20 | 20 | $params = $request->get_params(); |
| 21 | 21 | $search_term = trim( $params[ self::SEARCH_TERM_KEY ] ?? '' ); |
| 22 | 22 | |
| @@ -34,66 +34,80 @@ | ||
| 34 | 34 | $requested_count = $params[ self::ITEMS_COUNT_KEY ] ?? 0; |
| 35 | 35 | $validated_count = max( $requested_count, 1 ); |
| 36 | 36 | $count = min( $validated_count, self::MAX_RESPONSE_COUNT ); |
| 37 | 37 | |
| 38 | - $wp_request = new \WP_REST_Request( 'GET', '/wp/v2/users' ); | |
| 39 | - $wp_request->set_param( 'search', $search_term ); | |
| 40 | - $wp_request->set_param( 'per_page', $count ); | |
| 41 | - $wp_request->set_param( 'context', 'edit' ); | |
| 38 | + $query_args = [ | |
| 39 | + 'number' => $count, | |
| 40 | + 'search' => "*$search_term*", | |
| 41 | + ]; | |
| 42 | 42 | |
| 43 | - $response = rest_do_request( $wp_request ); | |
| 43 | + if ( ! empty( $params[ self::META_QUERY_KEY ] ) && is_array( $params[ self::META_QUERY_KEY ] ) ) { | |
| 44 | + $query_args['meta_query'] = $params[ self::META_QUERY_KEY ]; | |
| 45 | + } | |
| 44 | 46 | |
| 45 | - if ( $response->is_error() ) { | |
| 46 | - return new \WP_REST_Response( [ | |
| 47 | - 'success' => true, | |
| 48 | - 'data' => [ | |
| 49 | - 'value' => [], | |
| 50 | - ], | |
| 51 | - ], 200 ); | |
| 52 | - } | |
| 47 | + $this->add_filter_to_customize_query(); | |
| 48 | + $users = Collection::make( get_users( $query_args ) ); | |
| 49 | + $this->remove_filter_to_customize_query(); | |
| 53 | 50 | |
| 54 | 51 | global $wp_roles; |
| 55 | 52 | $roles = $wp_roles->roles; |
| 56 | 53 | |
| 57 | - $users = Collection::make( $response->get_data() ); | |
| 58 | - | |
| 59 | - $result = new \WP_REST_Response( [ | |
| 54 | + return new \WP_REST_Response( [ | |
| 60 | 55 | 'success' => true, |
| 61 | 56 | 'data' => [ |
| 62 | - 'value' => array_values( $users->map( function ( $user ) use ( $keys_format_map, $roles ) { | |
| 63 | - $user_data = [ | |
| 64 | - 'ID' => $user['id'], | |
| 65 | - 'display_name' => $user['name'], | |
| 66 | - ]; | |
| 57 | + 'value' => array_values( $users | |
| 58 | + ->map( function ( $user ) use ( $keys_format_map, $roles ) { | |
| 59 | + $user_object = (array) $user; | |
| 60 | + $user_object['display_name'] = $user->data->display_name; | |
| 67 | 61 | |
| 68 | - if ( ! empty( $user['roles'][0] ) ) { | |
| 69 | - $user_role = $user['roles'][0]; | |
| 70 | - $role_name = $roles[ $user_role ]['name'] ?? ucfirst( $user_role ); | |
| 71 | - $user_data['role'] = $role_name; | |
| 72 | - } | |
| 62 | + if ( isset( $user_object['roles'][0] ) ) { | |
| 63 | + $user_role = $user_object['roles'][0]; | |
| 64 | + $role = $roles[ $user_role ]['name']; | |
| 65 | + $user_object['role'] = $role ?? ucfirst( $user_role ); | |
| 66 | + } | |
| 73 | 67 | |
| 74 | - return $this->translate_keys( $user_data, $keys_format_map ); | |
| 75 | - } )->all() ), | |
| 68 | + return $this->translate_keys( $user_object, $keys_format_map ); | |
| 69 | + } ) | |
| 70 | + ->all() ), | |
| 76 | 71 | ], |
| 77 | 72 | ], 200 ); |
| 73 | + } | |
| 78 | 74 | |
| 79 | - _doing_it_wrong( | |
| 80 | - 'elementor/v1/user', | |
| 81 | - 'Use wp/v2/users instead. This endpoint will be removed in 4.6.0 version.', | |
| 82 | - '4.0.4' | |
| 83 | - ); | |
| 75 | + public function customize_user_query( $columns ) { | |
| 76 | + if ( ! in_array( 'ID', $columns, true ) ) { | |
| 77 | + $columns[] = 'ID'; | |
| 78 | + } | |
| 84 | 79 | |
| 85 | - return $result; | |
| 80 | + return $columns; | |
| 86 | 81 | } |
| 87 | 82 | |
| 88 | - protected function permission_check( \WP_REST_Request $request ): bool { | |
| 89 | - return current_user_can( 'list_users' ); | |
| 83 | + /** | |
| 84 | + * @return void | |
| 85 | + */ | |
| 86 | + private function add_filter_to_customize_query() { | |
| 87 | + $priority = self::SEARCH_FILTER_PRIORITY; | |
| 88 | + $accepted_args = self::SEARCH_FILTER_ACCEPTED_ARGS; | |
| 89 | + | |
| 90 | + add_filter( 'user_search_columns', [ $this, 'customize_user_query' ], $priority, $accepted_args ); | |
| 90 | 91 | } |
| 91 | 92 | |
| 93 | + /** | |
| 94 | + * @return void | |
| 95 | + */ | |
| 96 | + private function remove_filter_to_customize_query() { | |
| 97 | + $priority = self::SEARCH_FILTER_PRIORITY; | |
| 98 | + $accepted_args = self::SEARCH_FILTER_ACCEPTED_ARGS; | |
| 99 | + | |
| 100 | + remove_filter( 'user_search_columns', [ $this, 'customize_user_query' ], $priority, $accepted_args ); | |
| 101 | + } | |
| 102 | + | |
| 103 | + /** | |
| 104 | + * @return array | |
| 105 | + */ | |
| 92 | 106 | protected function get_endpoint_registration_args(): array { |
| 93 | 107 | return [ |
| 94 | 108 | self::SEARCH_TERM_KEY => [ |
| 95 | - 'description' => 'Users to search', | |
| 109 | + 'description' => 'Posts to search', | |
| 96 | 110 | 'type' => 'string', |
| 97 | 111 | 'required' => false, |
| 98 | 112 | 'default' => '', |
| 99 | 113 | 'sanitize_callback' => 'sanitize_text_field', |
| @@ -109,9 +123,9 @@ | ||
| 109 | 123 | ], |
| 110 | 124 | 'sanitize_callback' => fn ( ...$args ) => self::sanitize_string_array( ...$args ), |
| 111 | 125 | ], |
| 112 | 126 | self::ITEMS_COUNT_KEY => [ |
| 113 | - 'description' => 'Number of users to return', | |
| 127 | + 'description' => 'Posts per page', | |
| 114 | 128 | 'type' => 'integer', |
| 115 | 129 | 'required' => false, |
| 116 | 130 | 'default' => self::MAX_RESPONSE_COUNT, |
| 117 | 131 | ], |
| @@ -116,8 +130,10 @@ | ||
| 116 | 130 | 'default' => self::MAX_RESPONSE_COUNT, |
| 117 | 131 | ], |
| 118 | 132 | ]; |
| 119 | 133 | } |
| 134 | + | |
| 135 | + | |
| 120 | 136 | |
| 121 | 137 | protected static function get_allowed_param_keys(): array { |
| 122 | 138 | return [ |
| 123 | 139 | self::KEYS_CONVERSION_MAP_KEY, |