Come utilizzare la WP REST API per la registrazione di nuovi utenti (form di iscrizione)?

25 apr 2017, 17:24:27
Visualizzazioni: 44.2K
Voti: 4

È possibile creare un modulo di registrazione che funzioni attraverso la WP REST API per permettere ai visitatori di creare account sul mio sito?

Posso creare un tale modulo e utilizzarlo per creare nuovi utenti. Questo funziona con wp_rest nonce quando sono loggato come amministratore.

Ma se c'è un visitatore che non ha effettuato l'accesso, lo stesso modulo ovviamente non funziona. Penso che sia una questione di autenticazione. Potete suggerire un'idea generale su come farlo funzionare? Come posso permettere ai visitatori di registrarsi utilizzando la REST API?

0
Tutte le risposte alla domanda 5
5

Spero tu abbia già trovato la risposta. Ecco la nostra soluzione, per tua referenza. :D

Il seguente codice dovrebbe aggiungere la Registrazione Utente via REST API al tuo sito WordPress. Supporta la registrazione di 'subscriber' e 'customer'.

Aggiungilo al tuo function.php

add_action('rest_api_init', 'wp_rest_user_endpoints');
/**
 * Registra un nuovo utente
 *
 * @param  WP_REST_Request $request Dettagli completi sulla richiesta.
 * @return array $args.
 **/
function wp_rest_user_endpoints($request) {
  /**
   * Gestisce la richiesta di Registrazione Utente.
   */
  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, __("Il campo 'username' è obbligatorio.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  if (empty($email)) {
    $error->add(401, __("Il campo 'email' è obbligatorio.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  if (empty($password)) {
    $error->add(404, __("Il campo 'password' è obbligatorio.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  // if (empty($role)) {
  //  $role = 'subscriber';
  // } else {
  //     if ($GLOBALS['wp_roles']->is_role($role)) {
  //      // Silenzio è d'oro
  //     } else {
  //    $error->add(405, __("Il campo 'role' non è valido. Controlla i Ruoli Utente dal Pannello.", '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)) {
      // Ottieni i Meta Data Utente (Sensibili, Password inclusa. NON passare al front end.)
      $user = get_user_by('id', $user_id);
      // $user->set_role($role);
      $user->set_role('subscriber');
      // Codice specifico per WooCommerce
      if (class_exists('WooCommerce')) {
        $user->set_role('customer');
      }
      // Ottieni i Data Utente (Non sensibili, Passa al front end.)
      $response['code'] = 200;
      $response['message'] = __("Registrazione utente '" . $username . "' avvenuta con successo", "wp-rest-user");
    } else {
      return $user_id;
    }
  } else {
    $error->add(406, __("Email già esistente, prova con 'Recupera Password'", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  return new WP_REST_Response($response, 123);
}

IMHO, un modo migliore sarebbe includere la funzione aggiuntiva come plugin separato. Così anche quando l'utente cambia tema, le tue chiamate API non saranno influenzate.

Per questo ho sviluppato un plugin per la Registrazione Utente via REST API in WordPress. Ancora meglio, supporta anche la creazione di 'customer' per WooCommerce!

WP REST User, dagli un'occhiata se vuoi.

30 apr 2018 20:53:48
Commenti

Ehi amico, grazie mille! Funziona davvero

Lai32290 Lai32290
1 mag 2020 18:16:21

utente creato correttamente ma la risposta mostra un errore

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

Tieni presente che questo hook non rispetta l'impostazione di iscrizione. Puoi aggiungere get_option('users_can_register') per farlo.

idleberg idleberg
3 set 2022 01:02:57

Non riesco a scaricare il plugin. Posso usarlo per wp 6.1

sakarya sakarya
7 mar 2023 21:32:46

È un modo sicuro per inviare una password? Come sarebbe un esempio di richiesta?

Seano Seano
18 giu 2023 15:32:12
7

Potresti creare la tua routine di registrazione utilizzando wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php (WP v4.7.4) come implementazione di riferimento. Potresti anche modificare la versione di WordPress facendo qualcosa come segue:

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

                // METODO 1: Forza silenziosamente il ruolo a essere "subscriber"
                // $request->set_param('roles', array('subscriber'));

                // METODO 2: Sii gentile e fornisci un messaggio di errore
                if ( ! current_user_can( 'create_users' ) && $request['roles'] !== array('subscriber')) {

                    return new WP_Error(
                        'rest_cannot_create_user',
                        __( 'Spiacente, sei autorizzato a creare nuovi utenti solo con il ruolo di subscriber.' ),
                        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' );

Le parti importanti sono la chiave permission_callback (dove stai essenzialmente disabilitando l'autenticazione) e la chiave args che potrebbe essere utilizzata per aggiungere un captcha per evitare che gli spammer sovraccarichino il servizio. Spero che questo ti sia utile.

26 apr 2017 17:35:52
Commenti

Abilitare la possibilità per persone arbitrarie di creare utenti non è realmente sicuro. Potrebbero semplicemente crearsi un utente con livello di Admin e prendere il controllo del tuo sito. Dovresti invece utilizzare il flusso di registrazione, che attualmente non ha una chiamata API dedicata. Inviarli alla pagina wp-login.php?action=register e permettere loro di creare un account lì.

Otto Otto
9 set 2017 22:53:14

@Otto Stavo cercando di mostrare una proof of concept non l'implementazione esatta. È passato un po' di tempo dall'ultima volta che ho guardato questo aspetto, ma come sarebbe diverso da wp-login.php?action=register se l'unico tipo di utente che puoi creare fosse un "subscriber" se non sei autenticato? Posso renderlo più chiaro nel mio post?

JSP JSP
10 set 2017 16:03:51

La rotta Rest API ti permette di creare utenti con qualsiasi ruolo, non solo subscribers. Tuttavia, ha un controllo per prevenire la promozione dei ruoli, quindi potrebbe essere accettabile. Dovresti testare che non sia possibile, ad esempio, creare semplicemente un utente di livello Admin.

Otto Otto
10 set 2017 17:05:42

@Otto Pensi che questa sia una soluzione migliore?

JSP JSP
14 set 2017 23:57:41

No. Potrebbe funzionare, potrebbe non farlo. Non l'ho testato in alcun modo.

Otto Otto
15 set 2017 15:20:20

@Otto L'ho testato e funziona. Dal momento che sei così contrario a questa soluzione, forse dovresti proporre una soluzione al problema originale.

JSP JSP
15 set 2017 18:19:37

Le mie preoccupazioni sono semplicemente basate sulla sicurezza. Creare utenti è potenzialmente pericoloso, quindi una soluzione del genere dovrebbe essere testata adeguatamente prima di essere raccomandata. Se funziona correttamente, allora è fantastico. È solo che non ho mai visto nessuno apportare una modifica simile all'API REST prima d'ora, quindi ci sono alcune preoccupazioni valide da affrontare.

Otto Otto
17 set 2017 18:14:19
Mostra i restanti 2 commenti
1

Creerei una route personalizzata per il tuo sito che raccolga i campi necessari e poi chiami la funzione interna wp_insert_user(). In questo modo potresti validare le informazioni fornite dall'utente, incluso limitare il ruolo che possono ottenere. Sarei anche tentato di limitare il numero di utenti che possono essere creati dallo stesso indirizzo IP in un giorno, o qualcosa di simile.

15 set 2017 00:12:19
Commenti

Documentazione sulle route personalizzate: http://v2.wp-api.org/extending/adding/

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

Ora esiste un plugin chiamato WP Webhooks che può fare questo.

Secondo la pagina del plugin:

Ti permette di attivare azioni (come creare un utente o un articolo) in WordPress quando ricevi dati da altri servizi.

Molte soluzioni per moduli funzionano con Zapier (inclusi Gravity Forms, JotForm, Formidable e persino Google Forms) quindi una di queste potrebbe essere utilizzata per attivare una nuova registrazione utente utilizzando questo metodo.

WordPress ha già un supporto nativo per Zapier senza questo plugin, ma la creazione di un nuovo utente non è un'azione supportata utilizzando l'app nativa Zapier di WordPress.

26 ago 2019 14:38:59
0
-1

Prova WP REST User che offre funzionalità per creare utenti e reimpostare le password

20 set 2020 23:24:15