¿Cómo usar la API REST de WP para el registro de nuevos usuarios (formulario de registro)?

25 abr 2017, 17:24:27
Vistas: 44.2K
Votos: 4

¿Es posible crear un formulario de registro que pueda funcionar a través de la API REST de WordPress para que los visitantes puedan crear cuentas en mi sitio?

Puedo crear dicho formulario y usarlo para crear nuevos usuarios. Esto funciona con wp_rest nonce cuando estoy conectado como administrador.

Pero si hay un visitante que no está conectado, el mismo formulario no funciona por supuesto. Creo que es una cuestión de autenticación. ¿Pueden sugerir una idea general de cómo puede funcionar esto? ¿Cómo puedo permitir que los visitantes puedan registrarse usando la API REST?

0
Todas las respuestas a la pregunta 5
5

Espero que ya hayas encontrado la respuesta. Aquí está nuestra solución, para tu referencia. :D

El siguiente código debería agregar el Registro de Usuario mediante REST API a tu sitio WordPress. Admite el registro de 'subscriber' y 'customer'.

Agrégalo a tu functions.php

add_action('rest_api_init', 'wp_rest_user_endpoints');
/**
 * Registrar un nuevo usuario
 *
 * @param  WP_REST_Request $request Detalles completos sobre la solicitud.
 * @return array $args.
 **/
function wp_rest_user_endpoints($request) {
  /**
   * Manejar solicitud de registro de usuario.
   */
  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, __("El campo 'username' es requerido.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  if (empty($email)) {
    $error->add(401, __("El campo 'email' es requerido.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  if (empty($password)) {
    $error->add(404, __("El campo 'password' es requerido.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  // if (empty($role)) {
  //  $role = 'subscriber';
  // } else {
  //     if ($GLOBALS['wp_roles']->is_role($role)) {
  //      // Silencio es oro
  //     } else {
  //    $error->add(405, __("El campo 'role' no es válido. Verifica tus Roles de Usuario desde el Panel.", '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)) {
      // Obtener Metadatos de Usuario (Sensible, incluye contraseña. NO pasar al front end.)
      $user = get_user_by('id', $user_id);
      // $user->set_role($role);
      $user->set_role('subscriber');
      // Código específico de WooCommerce
      if (class_exists('WooCommerce')) {
        $user->set_role('customer');
      }
      // Obtener Datos de Usuario (No sensible, pasar al front end.)
      $response['code'] = 200;
      $response['message'] = __("El registro del usuario '" . $username . "' fue exitoso", "wp-rest-user");
    } else {
      return $user_id;
    }
  } else {
    $error->add(406, __("El correo ya existe, por favor intenta 'Restablecer contraseña'", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  return new WP_REST_Response($response, 123);
}

En mi opinión, una forma mejor sería incluir la función adicional como un plugin separado. Así, incluso cuando el usuario cambie de tema, tus llamadas API no se verán afectadas.

Por lo tanto, he desarrollado un plugin para el Registro de Usuario mediante REST API en WordPress. ¡Mejor aún, también soporta la creación de 'customer' para WooCommerce!

WP REST User, échale un vistazo si lo deseas.

30 abr 2018 20:53:48
Comentarios

¡Oye amigo, muchísimas gracias! Realmente funciona

Lai32290 Lai32290
1 may 2020 18:16:21

usuario creado correctamente pero la respuesta muestra un error

vadivel a vadivel a
8 ago 2020 14:48:17

Tenga en cuenta que este hook no respeta la configuración de membresía. Puede agregar get_option('users_can_register') para hacerlo.

idleberg idleberg
3 sept 2022 01:02:57

No puedo descargar el plugin. ¿Puedo usarlo para WordPress 6.1?

sakarya sakarya
7 mar 2023 21:32:46

¿Es esta una forma segura de enviar una contraseña? ¿Cómo se vería un ejemplo de solicitud?

Seano Seano
18 jun 2023 15:32:12
7

Podrías crear tu propia rutina de registro usando wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php (WP v4.7.4) como una implementación de referencia. También podrías modificar la versión de WordPress haciendo algo como lo siguiente:

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 ) {

                // MÉTODO 1: Forzar silenciosamente el rol a suscriptor
                // $request->set_param('roles', array('subscriber'));

                // MÉTODO 2: Ser amable y proporcionar un mensaje de error
                if ( ! current_user_can( 'create_users' ) && $request['roles'] !== array('subscriber')) {

                    return new WP_Error(
                        'rest_cannot_create_user',
                        __( 'Lo siento, solo tienes permitido crear nuevos usuarios con el rol de suscriptor.' ),
                        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' );

Las partes importantes son la clave permission_callback (donde esencialmente estás deshabilitando la autenticación) y la clave args que podría usarse para agregar un captcha y evitar que los spammers saturen el servicio. Espero que esto ayude.

26 abr 2017 17:35:52
Comentarios

Permitir que personas arbitrarias creen usuarios no es realmente seguro. Podrían simplemente crearse un usuario con nivel de Administrador y tomar el control de tu sitio. En su lugar, deberías usar el flujo de registro, que actualmente no tiene una llamada API para ello. Envíalos a la página wp-login.php?action=register y permite que creen una cuenta allí.

Otto Otto
9 sept 2017 22:53:14

@Otto Estaba intentando mostrar una prueba de concepto, no la implementación exacta. Hace tiempo que no miro esto, pero ¿en qué sería diferente de wp-login.php?action=register si el único tipo de usuario que podrías crear fuera un "suscriptor" si no estás autenticado? ¿Puedo aclarar eso mejor en mi publicación?

JSP JSP
10 sept 2017 16:03:51

La ruta de la API REST te permite crear usuarios de cualquier rol, no solo suscriptores. Aunque tiene una verificación para evitar la promoción de roles, por lo que podría ser aceptable. Deberías probar que no puedas, por ejemplo, simplemente crear un usuario con nivel de Administrador.

Otto Otto
10 sept 2017 17:05:42

@Otto ¿Crees que esta es una mejor solución?

JSP JSP
14 sept 2017 23:57:41

No. Podría funcionar, o podría no hacerlo. No lo he probado de ninguna manera.

Otto Otto
15 sept 2017 15:20:20

@Otto Lo he probado y funciona. Ya que estás tan en contra de esta solución, quizás deberías ofrecer una solución al problema original.

JSP JSP
15 sept 2017 18:19:37

Mis preocupaciones se basan simplemente en la seguridad. Crear usuarios es potencialmente peligroso, por lo que dicha solución debería probarse adecuadamente antes de ser recomendada. Si funciona correctamente, entonces es genial. Simplemente nunca he visto a nadie hacer un cambio como este en la API REST antes, por lo que hay algunas preocupaciones válidas que deben abordarse.

Otto Otto
17 sept 2017 18:14:19
Mostrar los 2 comentarios restantes
1

Yo crearía una ruta personalizada para tu sitio que recoja los campos que necesitas y luego llame a la función interna wp_insert_user(). De esta manera podrías validar la información que el usuario está proporcionando, incluyendo restringir qué rol se le permite asignar. También estaría tentado a limitar el número de usuarios que pueden ser creados por la misma dirección IP en un día, o algo por el estilo.

15 sept 2017 00:12:19
Comentarios

Documentación de rutas personalizadas: http://v2.wp-api.org/extending/adding/

Shawn H Shawn H
15 sept 2017 00:12:53
0

Ahora existe un plugin llamado WP Webhooks que puede hacer esto.

Según la página del plugin:

Te permite activar acciones (como crear un usuario o una publicación) en WordPress al recibir datos de otros servicios.

Muchas soluciones de formularios funcionan con Zapier (incluyendo Gravity Forms, JotForm, Formidable e incluso Google Forms), por lo que cualquiera de estas podría usarse para activar un nuevo registro de usuario mediante este método.

WordPress ya tiene soporte nativo para Zapier sin necesidad de este plugin, pero crear un nuevo usuario no es una acción soportada usando la aplicación nativa de WordPress para Zapier.

26 ago 2019 14:38:59
0
-1

Prueba WP REST User, tiene funcionalidad para crear usuarios y restablecer contraseñas

20 sept 2020 23:24:15