Как использовать WP REST API для регистрации новых пользователей (форма регистрации)?

25 апр. 2017 г., 17:24:27
Просмотры: 44.2K
Голосов: 4

Возможно ли создать форму регистрации, которая будет работать через WP REST API, чтобы посетители могли создавать учетные записи на моем сайте?

Я могу создать такую форму и использовать ее для создания новых пользователей. Это работает с wp_rest nonce, когда я авторизован как администратор.

Но если посетитель не авторизован, та же форма, конечно, не работает. Я думаю, это вопрос аутентификации. Можете ли вы предложить общую идею, как это может работать? Как разрешить посетителям регистрироваться через REST API?

0
Все ответы на вопрос 5
5

надеюсь, вы уже нашли ответ. Вот наше решение для вашего ознакомления. :D

Следующий код добавит регистрацию пользователей через REST API на ваш WordPress сайт. Он поддерживает регистрацию ролей 'subscriber' и 'customer'.

Добавьте это в ваш function.php

add_action('rest_api_init', 'wp_rest_user_endpoints');
/**
 * Регистрация нового пользователя
 *
 * @param  WP_REST_Request $request Полные данные о запросе.
 * @return array $args.
 **/
function wp_rest_user_endpoints($request) {
  /**
   * Обработка запроса на регистрацию пользователя.
   */
  register_rest_route('wp/v2', 'users/register', array(
    'methods' => 'POST',
    'callback' => 'wc_rest_user_endpoint_handler',
  ));
}
function wc_rest_user_endpoint_handler($request = null) {
  $response = array();
  $parameters = $request->get_json_params();
  $username = sanitize_text_field($parameters['username']);
  $email = sanitize_text_field($parameters['email']);
  $password = sanitize_text_field($parameters['password']);
  // $role = sanitize_text_field($parameters['role']);
  $error = new WP_Error();
  if (empty($username)) {
    $error->add(400, __("Поле 'username' обязательно для заполнения.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  if (empty($email)) {
    $error->add(401, __("Поле 'email' обязательно для заполнения.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  if (empty($password)) {
    $error->add(404, __("Поле 'password' обязательно для заполнения.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  // if (empty($role)) {
  //  $role = 'subscriber';
  // } else {
  //     if ($GLOBALS['wp_roles']->is_role($role)) {
  //      // Без комментариев
  //     } else {
  //    $error->add(405, __("Роль 'role' недопустима. Проверьте роли пользователей в админке.", 'wp_rest_user'), array('status' => 400));
  //    return $error;
  //     }
  // }
  $user_id = username_exists($username);
  if (!$user_id && email_exists($email) == false) {
    $user_id = wp_create_user($username, $password, $email);
    if (!is_wp_error($user_id)) {
      // Получаем метаданные пользователя (Конфиденциально, включает пароль. НЕ передавать на фронтенд.)
      $user = get_user_by('id', $user_id);
      // $user->set_role($role);
      $user->set_role('subscriber');
      // Код специфичный для WooCommerce
      if (class_exists('WooCommerce')) {
        $user->set_role('customer');
      }
      // Получаем данные пользователя (Не конфиденциально, можно передавать на фронтенд.)
      $response['code'] = 200;
      $response['message'] = __("Регистрация пользователя '" . $username . "' прошла успешно", "wp-rest-user");
    } else {
      return $user_id;
    }
  } else {
    $error->add(406, __("Email уже существует, попробуйте 'Сбросить пароль'", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  return new WP_REST_Response($response, 123);
}

По моему мнению, лучшим решением будет вынести эту дополнительную функциональность в отдельный плагин. Так даже при смене темы ваши API-вызовы не пострадают.

Поэтому я разработал плагин для регистрации пользователей через REST API в WordPress. Более того, он поддерживает создание 'customer' для WooCommerce!

WP REST User, посмотрите, если интересно.

30 апр. 2018 г. 20:53:48
Комментарии

Эй, чувак, спасибо огромное! Это действительно работает

Lai32290 Lai32290
1 мая 2020 г. 18:16:21

Пользователь создан успешно, но в ответе отображается ошибка

vadivel a vadivel a
8 авг. 2020 г. 14:48:17

Обратите внимание, что этот хук не учитывает настройки членства. Вы можете добавить get_option('users_can_register'), чтобы это исправить.

idleberg idleberg
3 сент. 2022 г. 01:02:57

Я не могу скачать плагин. Можно ли использовать его для WP 6.1?

sakarya sakarya
7 мар. 2023 г. 21:32:46

Это безопасный способ отправки пароля? Как будет выглядеть пример запроса?

Seano Seano
18 июн. 2023 г. 15:32:12
7

Вы можете создать свою собственную процедуру регистрации, используя в качестве примера реализацию wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php (WP v4.7.4). Также вы можете модифицировать версию WordPress, сделав что-то вроде следующего:

function nLbwuEa8_modify_create_user_route() {
    $users_controller = new WP_REST_Users_Controller();

    register_rest_route( 'wp/v2', '/users', array(
        array(
            'methods'             => WP_REST_Server::CREATABLE,
            'callback'            => array($users_controller, 'create_item'),
            'permission_callback' => function( $request ) {

                // МЕТОД 1: Тихим образом принудительно установить роль "подписчик"
                // $request->set_param('roles', array('subscriber'));

                // МЕТОД 2: Быть вежливым и предоставить сообщение об ошибке
                if ( ! current_user_can( 'create_users' ) && $request['roles'] !== array('subscriber')) {

                    return new WP_Error(
                        'rest_cannot_create_user',
                        __( 'Извините, вы можете создавать новых пользователей только с ролью подписчика.' ),
                        array( 'status' => rest_authorization_required_code() )
                    );

                }

                return true;
            },
            'args'                => $users_controller->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
        ),
    ) );

} );
add_action( 'rest_api_init', 'nLbwuEa8_modify_create_user_route' );

Ключевыми моментами являются параметр permission_callback (где вы, по сути, отключаете аутентификацию) и параметр args, который можно использовать для добавления капчи, чтобы предотвратить наводнение сервиса спамерами. Надеюсь, это поможет.

26 апр. 2017 г. 17:35:52
Комментарии

Предоставление возможности произвольным людям создавать пользователей не совсем безопасно. Они могут просто создать себе пользователя с уровнем Администратора и захватить ваш сайт. Вместо этого вам следует использовать стандартный процесс регистрации, который в настоящее время не имеет API вызова. Отправьте их на страницу wp-login.php?action=register и позвольте им создать аккаунт там.

Otto Otto
9 сент. 2017 г. 22:53:14

@Otto Я пытался показать proof of concept, а не точную реализацию. Прошло много времени с тех пор, как я смотрел на это, но чем это будет отличаться от wp-login.php?action=register, если единственный тип пользователя, которого можно создать без аутентификации — это "подписчик"? Могу ли я сделать это более понятным в своем посте?

JSP JSP
10 сент. 2017 г. 16:03:51

Маршрут Rest API позволяет создавать пользователей с любой ролью, не только подписчиков. Хотя там есть проверка, предотвращающая повышение ролей, так что это может быть приемлемо. Вам нужно проверить, что нельзя, например, просто создать пользователя с уровнем Администратора.

Otto Otto
10 сент. 2017 г. 17:05:42

@Otto Ты считаешь, что это лучшее решение?

JSP JSP
14 сент. 2017 г. 23:57:41

Нет. Оно может работать, а может и нет. Я никак это не тестировал.

Otto Otto
15 сент. 2017 г. 15:20:20

@Otto Я проверил — оно работает. Раз ты так категорически против этого решения, может, предложишь решение исходной проблемы.

JSP JSP
15 сент. 2017 г. 18:19:37

Мои опасения связаны исключительно с вопросами безопасности. Создание пользователей потенциально опасно, поэтому такое решение следует тщательно протестировать, прежде чем рекомендовать его. Если оно работает корректно, то это замечательно. Просто я никогда раньше не видел, чтобы кто-то вносил подобные изменения в REST API, поэтому есть обоснованные опасения, которые нужно учесть.

Otto Otto
17 сент. 2017 г. 18:14:19
Показать остальные 2 комментариев
1

Я бы создал пользовательский маршрут для вашего сайта, который собирает необходимые поля и затем вызывает внутреннюю функцию wp_insert_user(). Таким образом, вы сможете проверять информацию, предоставляемую пользователем, включая ограничение роли, которую они могут получить. Я также рекомендовал бы ограничить количество пользователей, которые могут быть созданы с одного IP-адреса в день, или что-то в этом роде.

15 сент. 2017 г. 00:12:19
Комментарии

Документация по пользовательским маршрутам: http://v2.wp-api.org/extending/adding/

Shawn H Shawn H
15 сент. 2017 г. 00:12:53
0

Сейчас существует плагин под названием WP Webhooks, который может это сделать.

Согласно странице плагина:

Он позволяет запускать действия (такие как создание пользователя или записи) в WordPress при получении данных из других сервисов.

Многие решения для форм работают с Zapier (включая Gravity Forms, JotForm, Formidable и даже Google Forms), поэтому одну из них можно использовать для запуска регистрации нового пользователя этим методом.

WordPress уже имеет нативную поддержку Zapier без этого плагина, но создание нового пользователя не является поддерживаемым действием в нативном приложении WordPress для Zapier.

26 авг. 2019 г. 14:38:59
0
-1

Попробуйте WP REST User — этот плагин предоставляет функционал создания пользователей и сброса пароля.

20 сент. 2020 г. 23:24:15