\WP_REST_Server::READABLE, 'callback' => [self::class, 'search'], 'permission_callback' => '__return_true', 'args' => [ 'country' => [ 'description' => __('Two-letter country code.', 'address-autocomplete-geoscale'), 'type' => 'string', 'enum' => self::SUPPORTED_COUNTRIES, 'required' => true, 'validate_callback' => 'rest_validate_request_arg', 'sanitize_callback' => 'sanitize_text_field', ], 'q' => [ 'description' => __('Partial address input.', 'address-autocomplete-geoscale'), 'type' => 'string', 'minLength' => 3, 'maxLength' => 128, 'required' => true, 'validate_callback' => 'rest_validate_request_arg', 'sanitize_callback' => 'sanitize_text_field', ], 'lang' => [ 'description' => __('Language used to localize the response.', 'address-autocomplete-geoscale'), 'type' => 'string', 'maxLength' => 35, 'required' => false, 'default' => '', 'validate_callback' => 'rest_validate_request_arg', 'sanitize_callback' => 'sanitize_text_field', ], ], ]); } private static function register_select_route() { register_rest_route(self::NAMESPACE, '/address/(?P[A-Za-z0-9]+)', [ 'methods' => \WP_REST_Server::READABLE, 'callback' => [self::class, 'select'], 'permission_callback' => '__return_true', 'args' => [ 'lang' => [ 'description' => __('Language used to localize the response.', 'address-autocomplete-geoscale'), 'type' => 'string', 'maxLength' => 35, 'required' => false, 'default' => '', 'validate_callback' => 'rest_validate_request_arg', 'sanitize_callback' => 'sanitize_text_field', ], ], ]); } public static function search(\WP_REST_Request $request) { $client = new Address_Client(); $results = $client->search( $request->get_param('country'), $request->get_param('q'), $request->get_param('lang') ); if (is_wp_error($results)) { return $results; } $addresses = []; foreach ($results['hits'] as $hit) { $addresses[] = [ 'id' => sanitize_text_field($hit['id'] ?? ''), 'label' => sanitize_text_field($hit['single_line'] ?? ''), ]; } return rest_ensure_response($addresses); } public static function select(\WP_REST_Request $request) { $client = new Address_Client(); $result = $client->select( $request->get_param('id'), $request->get_param('lang') ); if (is_wp_error($result)) { return $result; } return rest_ensure_response( Address_Mapper::map($result) ); } }