Cum să folosești WP REST API pentru înregistrarea noilor utilizatori (formular de înscriere)?

25 apr. 2017, 17:24:27
Vizualizări: 44.2K
Voturi: 4

Este posibil să creez un formular de înregistrare care să funcționeze prin WP REST API pentru ca vizitatorii să-și poată crea conturi pe site-ul meu?

Pot crea un astfel de formular și îl pot folosi pentru a crea utilizatori noi. Acesta funcționează cu wp_rest nonce când sunt autentificat ca administrator.

Dar dacă există un vizitator care nu este autentificat, același formular nu funcționează, bineînțeles. Cred că este o problemă de autentificare. Îmi puteți sugera o idee generală despre cum ar putea funcționa acest lucru? Cum pot permite vizitatorilor să se înregistreze folosind REST API?

0
Toate răspunsurile la întrebare 5
5

sperăm că ați găsit deja răspunsul. Iată soluția noastră, pentru referința dumneavoastră. :D

Următorul cod ar trebui să adauge Înregistrarea Utilizatorilor prin REST API la site-ul dumneavoastră WordPress. Acesta suportă înregistrarea pentru rolurile de 'subscriber' și 'customer'.

Adăugați-l în fișierul functions.php

add_action('rest_api_init', 'wp_rest_user_endpoints');
/**
 * Înregistrează un nou utilizator
 *
 * @param  WP_REST_Request $request Detalii complete despre cerere.
 * @return array $args.
 **/
function wp_rest_user_endpoints($request) {
  /**
   * Gestionează cererea de Înregistrare Utilizator.
   */
  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, __("Câmpul 'username' este obligatoriu.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  if (empty($email)) {
    $error->add(401, __("Câmpul 'email' este obligatoriu.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  if (empty($password)) {
    $error->add(404, __("Câmpul 'password' este obligatoriu.", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  // if (empty($role)) {
  //  $role = 'subscriber';
  // } else {
  //     if ($GLOBALS['wp_roles']->is_role($role)) {
  //      // Tăcerea este de aur
  //     } else {
  //    $error->add(405, __("Câmpul 'role' nu este valid. Verificați Rolurile Utilizatorilor din Panou.", '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)) {
      // Obține Meta Datele Utilizatorului (Sensibile, Parolă inclusă. NU trimite către front-end.)
      $user = get_user_by('id', $user_id);
      // $user->set_role($role);
      $user->set_role('subscriber');
      // Cod specific WooCommerce
      if (class_exists('WooCommerce')) {
        $user->set_role('customer');
      }
      // Obține Datele Utilizatorului (Non-Sensibile, Trimise către front-end.)
      $response['code'] = 200;
      $response['message'] = __("Înregistrarea utilizatorului '" . $username . "' a avut succes", "wp-rest-user");
    } else {
      return $user_id;
    }
  } else {
    $error->add(406, __("Email-ul există deja, vă rugăm să încercați 'Resetează Parola'", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  return new WP_REST_Response($response, 123);
}

În opinia mea, o metodă mai bună ar fi includerea funcției suplimentare ca un plugin separat. Astfel, chiar și atunci când tema este schimbată, apelurile API nu vor fi afectate.

Prin urmare, am dezvoltat un plugin pentru Înregistrarea Utilizatorilor prin REST API în WordPress. Mai mult, suportă și crearea de 'customer' pentru WooCommerce!

WP REST User, verificați-l dacă doriți.

30 apr. 2018 20:53:48
Comentarii

Hei omule, mulțumesc mult! Chiar funcționează

Lai32290 Lai32290
1 mai 2020 18:16:21

utilizator creat cu succes, dar răspunsul returnat arată eroare

vadivel a vadivel a
8 aug. 2020 14:48:17

Ține cont că acest hook nu ține cont de setările de membru. Poți adăuga get_option('users_can_register') pentru a face asta.

idleberg idleberg
3 sept. 2022 01:02:57

Nu pot descărca plugin-ul. Pot să-l folosesc pentru WP 6.1?

sakarya sakarya
7 mar. 2023 21:32:46

Este aceasta o metodă sigură de a trimite o parolă? Cum ar arăta o cerere exemplu?

Seano Seano
18 iun. 2023 15:32:12
7

Puteți crea propriul flux de înregistrare folosind wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php (WP v4.7.4) ca implementare de referință. De asemenea, puteți modifica versiunea WordPress făcând ceva similar cu următoarele:

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

                // METODA 1: Forțează în mod silențios rolul să fie subscriber
                // $request->set_param('roles', array('subscriber'));

                // METODA 2: Fii politicos și oferă un mesaj de eroare
                if ( ! current_user_can( 'create_users' ) && $request['roles'] !== array('subscriber')) {

                    return new WP_Error(
                        'rest_cannot_create_user',
                        __( 'Ne pare rău, aveți permisiunea să creați doar utilizatori noi cu rolul de 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' );

Părțile importante fiind cheia permission_callback (unde practic dezactivați autentificarea) și cheia args care ar putea fi utilizată pentru a adăuga un captcha, astfel încât spammerii să nu supraîncărce serviciul. Sper că acest lucru vă ajută.

26 apr. 2017 17:35:52
Comentarii

Permiterea posibilității ca persoane arbitrare să creeze utilizatori nu este chiar sigură. Acestea pot pur și simplu să își creeze un utilizator de nivel Admin și să preia controlul asupra site-ului tău. Ar trebui să folosești în schimb fluxul de înregistrare, care în prezent nu are un apel API pentru el. Trimite-i către pagina wp-login.php?action=register și lasă-i să își creeze un cont acolo.

Otto Otto
9 sept. 2017 22:53:14

@Otto Încercam să prezint o dovadă a conceptului, nu implementarea exactă. A trecut ceva timp de când m-am uitat la asta, dar cum ar fi diferit de wp-login.php?action=register dacă singurul tip de utilizator pe care ai putea să-l creezi era un "subscriber" dacă nu ești autentificat? Pot să fac asta mai clar în postarea mea?

JSP JSP
10 sept. 2017 16:03:51

Ruta Rest API îți permite să creezi utilizatori cu orice rol, nu doar subscribers. Deși, are o verificare pentru a preveni promovarea rolurilor, deci asta ar putea fi acceptabil. Ai vrea să testezi că nu ai putea, de exemplu, să creezi pur și simplu un utilizator de nivel Admin.

Otto Otto
10 sept. 2017 17:05:42

@Otto Crezi că aceasta este o soluție mai bună?

JSP JSP
14 sept. 2017 23:57:41

Nu. S-ar putea să funcționeze, s-ar putea să nu. Nu am testat-o în niciun fel.

Otto Otto
15 sept. 2017 15:20:20

@Otto Am testat-o și funcționează. Din moment ce ești atât de hotărât împotriva acestei soluții, poate ar trebui să oferi o soluție la problema inițială.

JSP JSP
15 sept. 2017 18:19:37

Preocupările mele se bazează pur și simplu pe aspectele de securitate. Crearea de utilizatori este potențial periculoasă, așa că o astfel de soluție ar trebui testată corespunzător înainte de a fi recomandată. Dacă funcționează corect, atunci este minunat. Doar că nu am văzut până acum pe cineva să facă o astfel de modificare la API-ul REST, așa că există câteva preocupări valide care trebuie abordate.

Otto Otto
17 sept. 2017 18:14:19
Arată celelalte 2 comentarii
1

Aș crea o rută personalizată pentru site-ul tău care să colecteze câmpurile necesare și apoi să apeleze funcția internă wp_insert_user(). În acest fel, ai putea valida informațiile furnizate de utilizator, inclusiv restricționarea rolului pe care îl poate obține. Aș fi tentat să limitez și numărul de utilizatori care pot fi creați de aceeași adresă IP într-o zi sau ceva similar.

15 sept. 2017 00:12:19
Comentarii

Documentație pentru rute personalizate: http://v2.wp-api.org/extending/adding/

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

Acum există un plugin numit WP Webhooks care poate face acest lucru.

Conform paginii pluginului:

Vă permite să declanșați acțiuni (cum ar fi crearea unui utilizator sau a unui articol) în WordPress la primirea de date de la alte servicii.

Multe soluții pentru formulare funcționează cu Zapier (inclusiv Gravity Forms, JotForm, Formidable și chiar Google Forms), așadar oricare dintre acestea ar putea fi folosite pentru a declanșa o înregistrare nouă de utilizator folosind această metodă.

Wordpress are deja suport nativ Zapier fără acest plugin, dar crearea unui utilizator nou nu este o acțiune acceptată prin aplicația WordPress Zapier nativă.

26 aug. 2019 14:38:59
0
-1

Încearcă WP REST User, are funcționalități de creare utilizator și resetare parolă

20 sept. 2020 23:24:15