Come utilizzare la WP REST API per la registrazione di nuovi utenti (form di iscrizione)?
È 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?

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.

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

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.

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 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?

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.

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

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

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.

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.

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

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.

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