Trimite email de activare utilizator la crearea programatică a utilizatorului
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.

Pentru a implementa procesul de activare a utilizatorului, trebuie să urmați următorii pași:
- după crearea unui nou utilizator, adăugați un câmp personalizat care indică faptul că acest utilizator trebuie să-și activeze contul
- 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
- implementați pagina de activare
- 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ă.

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?

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.

@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.

@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/.

@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 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.

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

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

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

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

Două opțiuni de ales:
Utilizează un plugin, de exemplu User activation email sau New User Approve
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.

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...
}
