Trimite email de activare utilizator la crearea programatică a utilizatorului

11 oct. 2013, 15:45:25
Vizualizări: 31.2K
Voturi: 11

M-am întrebat dacă cineva de aici m-ar putea ajuta.

Practic, am creat un formular personalizat de înregistrare care, atunci când este validat, inserează un utilizator în tabela de utilizatori.

function _new_user($data) {

    // Separare Date
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    wp_insert_user($default_newuser);
} 

Acum, ceea ce trebuie să fac este ca în loc să trimit emailul de confirmare, pe care știu că îl pot trimite cu următorul cod.

wp_new_user_notification($user_id, $data['user_pass']);

Vreau să trimit în schimb un email de activare pentru utilizator. Am încercat câteva lucruri dar nu pot găsi nimic concret. Sper că cineva s-a mai confruntat cu această problemă înainte.

0
Toate răspunsurile la întrebare 3
14
12

Pentru a implementa procesul de activare a utilizatorului, trebuie să urmați următorii pași:

  1. după crearea unui nou utilizator, adăugați un câmp personalizat care indică faptul că acest utilizator trebuie să-și activeze contul
  2. trimiteți un e-mail cu codul de activare, oferind un link în acest e-mail către o pagină unde utilizatorul va fi activat
  3. implementați pagina de activare
  4. când un utilizator încearcă să se autentifice, verificați dacă acel câmp personalizat există sau nu. Dacă există, nu-l autentificați și afișați în schimb un mesaj de eroare privind activarea.

Adăugare câmp personalizat și trimitere e-mail:

function _new_user($data) {

    // Separare date
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    $user_id = wp_insert_user($default_newuser);
    if ( $user_id && !is_wp_error( $user_id ) ) {
        $code = sha1( $user_id . time() );
        $activation_link = add_query_arg( array( 'key' => $code, 'user' => $user_id ), get_permalink( /* ID-UL PAGINII DE ACTIVARE AICI */ ));
        add_user_meta( $user_id, 'has_to_be_activated', $code, true );
        wp_mail( $data['user_email'], 'SUBJECT ACTIVARE', 'FELICITĂRI BLA BLA BLA. AICI ESTE LINK-UL TĂU DE ACTIVARE: ' . $activation_link );
    }
}

Verificare activare utilizator la autentificare:

// suprascriere funcție core
if ( !function_exists('wp_authenticate') ) :
function wp_authenticate($username, $password) {
    $username = sanitize_user($username);
    $password = trim($password);

    $user = apply_filters('authenticate', null, $username, $password);

    if ( $user == null ) {
        // TODO ce mesaj de eroare ar trebui să fie? (Sau acestea chiar se vor întâmpla?)
        // Necesar doar dacă toate handler-ele de autentificare eșuează să returneze ceva.
        $user = new WP_Error('authentication_failed', __('<strong>EROARE</strong>: Nume de utilizator invalid sau parolă incorectă.'));
    } elseif ( get_user_meta( $user->ID, 'has_to_be_activated', true ) != false ) {
        $user = new WP_Error('activation_failed', __('<strong>EROARE</strong>: Utilizatorul nu este activat.'));
    }

    $ignore_codes = array('empty_username', 'empty_password');

    if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
        do_action('wp_login_failed', $username);
    }

    return $user;
}
endif;

Pagina de activare:

add_action( 'template_redirect', 'wpse8170_activate_user' );
function wpse8170_activate_user() {
    if ( is_page() && get_the_ID() == /* ID-UL PAGINII DE ACTIVARE AICI */ ) {
        $user_id = filter_input( INPUT_GET, 'user', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
        if ( $user_id ) {
            // obține hash-ul de activare din meta utilizator
            $code = get_user_meta( $user_id, 'has_to_be_activated', true );
            if ( $code == filter_input( INPUT_GET, 'key' ) ) {
                delete_user_meta( $user_id, 'has_to_be_activated' );
            }
        }
    }
}

Acesta este punctul de pornire, adaptați-l în funcție de nevoile dumneavoastră.

11 oct. 2013 16:42:49
Comentarii

Bun post. Dar cred că ai ratat un lucru. Când împiedici utilizatorii neautorizați să se autentifice, cum reușești să obții user_id din get_current_user_id() pe pagina de activare?

s1lv3r s1lv3r
11 oct. 2013 17:05:29

la naiba... :) bun punct, o să repar imediat :)

Eugene Manuilov Eugene Manuilov
11 oct. 2013 17:06:33

Mulțumesc pentru această informație fantastică. Mă uitam să văd dacă există vreo soluție de bază pentru a declanșa trimiterea unui e-mail de activare, deoarece poți "retrimite activarea" în panoul de administrare. M-am gândit că prin inserarea unui utilizator ca în așteptare, ar putea fi generat un cod de activare și introdus în baza de date, dar după o inspecție mai amănunțită am descoperit că "evident" nu am avut noroc :) Oricum. Totul are sens și mulțumesc din nou.

Joe Buckle Joe Buckle
11 oct. 2013 17:07:21

@JoeBuckle Este ciudat. Nu ar trebui să ai deloc un link resend activation într-o instalare standard. Se întâmplă să ai deja un plugin instalat pentru asta? De asemenea, BuddyPress vine cu o funcționalitate de activare a utilizatorilor din cutie.

s1lv3r s1lv3r
11 oct. 2013 17:09:27

@s1lv3r Ar putea avea legătură cu Theme-My-Login?

Joe Buckle Joe Buckle
11 oct. 2013 17:10:52

@s1lv3r am actualizat răspunsul, acum va funcționa :)

Eugene Manuilov Eugene Manuilov
11 oct. 2013 17:10:57

@JoeBuckle Pagina de caracteristici a plugin-ului spune: Necesită ca utilizatorii să fie aprobați sau să confirme adresa de e-mail în momentul înregistrării http://wordpress.org/plugins/theme-my-login/.

s1lv3r s1lv3r
11 oct. 2013 17:13:08

@EugeneManuilov Bună treabă. Poate ar trebui să folosești și add_role() pentru a adăuga un rol de așteptare fără capabilități. :-)

s1lv3r s1lv3r
11 oct. 2013 17:16:09

@s1lv3r ah da, ai dreptate. Theme-My-Login poate face destul de multe și a fost pe acest site de ceva vreme. Dar acum implementez un proces de abonament paywall cu o perioadă gratuită etc... este doar un pic complicat așa că trebuie să merg pe varianta nativă. Până la finalul acestui proces, acel plugin va fi dezactivat.

Joe Buckle Joe Buckle
11 oct. 2013 17:17:03

@s1lv3r cum am spus, acesta este doar punctul de pornire, tot restul este în afara scopului răspunsului meu :)

Eugene Manuilov Eugene Manuilov
11 oct. 2013 17:17:06

@EugeneManuilov Ai dreptate. Nu am vrut să fiu prea exigent. :-)

s1lv3r s1lv3r
11 oct. 2013 17:17:56

primesc o eroare: WP_Error Object ( [errors] => Array ( [empty_user_login] => Array ( [0] => Nu se poate crea un utilizator cu nume de login gol. ) ) [error_data] => Array ( ) )

user2477139 user2477139
7 dec. 2016 20:14:14

totuși, când afișez login-ul utilizatorului și adresa de email, pot vedea datele

user2477139 user2477139
7 dec. 2016 20:14:47

Am o întrebare: Vreau să creez un buton extern în front-end "Retrimite Activarea" similar cu cel din wp-admin -> utilizatori -> în așteptare (Retrimite Activarea). Dar am nevoie de el pe o pagină din front-end. Nu vreau să creez o pagină personalizată de activare, doar să retrimit emailul folosind o funcție standard din WordPress

webstackoverload webstackoverload
28 feb. 2025 12:07:37
Arată celelalte 9 comentarii
0

Două opțiuni de ales:

  1. Utilizează un plugin, de exemplu User activation email sau New User Approve

  2. Codifică această funcționalitate singur.

Câteva funcții care te pot ajuta să începi:

  • wp_mail() pentru a trimite emailul,
  • add_user_meta() pentru a salva o cheie de activare pentru utilizator,
  • generează un link care conține cheia și adaugă-l în email, creează o pagină în WordPress care să intercepteze parametrul cheie (de exemplu folosind add_shortcode()),
  • folosește get_user_meta() pentru a verifica cheia de activare față de cea stocată în baza de date, adaugă o altă cheie de meta pentru utilizator pentru a-l marca ca activat în caz de succes,
  • adaugă o funcție la filtrul authenticate pentru a împiedica logarea oricărui utilizator care nu este activat.
11 oct. 2013 16:47:28
0

Puteți obține user_id făcând acest lucru în timpul autentificării:

$username='adresa de email furnizată de utilizator în panoul de login.';
$results = $wpdb->get_row( "SELECT ID FROM wp_users WHERE user_email='".$username."'");
   $activation_id = $results->ID;
   $activation_key =  get_user_meta( $activation_id, 'has_to_be_activated', true );
 if($activation_key != false )
 {
  echo '<h4 class="error">Contul dumneavoastră nu a fost încă activat.<br /> Pentru a-l activa, verificați email-ul și faceți clic pe link-ul de activare.</h4>';
 }
else{
//autentificați login-ul utilizatorului aici...
}
16 mai 2017 11:03:59