Permite utilizatorilor să seteze parola în timpul înregistrării
În site-ul meu, în prezent pentru fiecare înregistrare nouă, utilizatorul primește credentialele (nume de utilizator și parolă) pe email.
Vreau să permit utilizatorului să își seteze parola în momentul înregistrării, după care un link de verificare va fi trimis pe adresa de email.
Mai jos este codul pe care vreau să îl modific:
<form method="post" class="wp-user-form " id="wp_signup_form_' . $rand_id . '" enctype="multipart/form-data">
<div class="col-md-12 col-lg-12 col-sm-12 col-xs-12">';
$cs_opt_array = array(
'id' => '',
'std' => '',
'cust_id' => 'user_login_' . $rand_id,
'cust_name' => 'user_login' . $rand_id,
'classes' => 'form-control',
'extra_atr' => ' size="20" tabindex="101" placeholder="' . __('Nume utilizator*', 'theme_domain') . '"',
'return' => true,
);
$output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);
$output .= '</div>';
$output .=$cs_form_fields_frontend->cs_form_text_render(
array('name' => __('Email*', 'theme_domain'),
'id' => 'user_email' . $rand_id . '',
'classes' => 'col-md-12 col-lg-12 col-sm-12 col-xs-12',
'std' => '',
'description' => '',
'return' => true,
'hint' => ''
)
);
$output .=$cs_form_fields_frontend->cs_form_hidden_render(
array('name' => __('Tip post', 'theme_domain'),
'id' => 'user_role_type' . $rand_id . '',
'classes' => 'col-md-12 col-lg-12 col-sm-12 col-xs-12',
'std' => 'candidate',
'description' => '',
'return' => true,
'hint' => ''
)
);
if (is_user_logged_in()) {
$output .= '<div class="col-md-6 col-lg-6 col-sm-12 col-xs-12">';
$cs_opt_array = array(
'id' => '',
'std' => __('Creează cont', 'theme_domain'),
'cust_id' => 'submitbtn' . $rand_id,
'cust_name' => 'user-submit',
'cust_type' => 'button',
'extra_atr' => ' tabindex="103" onclick="javascript:show_alert_msg(\'' . __("Te rugăm să te deconectezi mai întâi înainte de înregistrare", "theme_domain") . '\')"',
'classes' => 'cs-bgcolor user-submit acc-submit',
'return' => true,
);
$output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);
$output .= '
<!--</div>-->
</div>';
} else {
$output .= '<div class="col-md-6 col-lg-6 col-sm-12 col-xs-12">';
$cs_opt_array = array(
'id' => '',
'std' => __('Creează cont', 'theme_domain'),
'cust_id' => 'submitbtn' . $rand_id,
'cust_name' => 'user-submit',
'cust_type' => 'button',
'extra_atr' => ' tabindex="103" onclick="javascript:cs_registration_validation(\'' . admin_url("admin-ajax.php") . '\',\'' . $rand_id . '\')"',
'classes' => 'cs-bgcolor user-submit acc-submit',
'return' => true,
);
$output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);
$cs_opt_array = array(
'id' => '',
'std' => $role,
'cust_id' => 'login-role',
'cust_name' => 'role',
'cust_type' => 'hidden',
'return' => true,
);
$output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);
$cs_opt_array = array(
'id' => '',
'std' => 'cs_registration_validation',
'cust_name' => 'action',
'cust_type' => 'hidden',
'return' => true,
);
$output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);
$output .= '
</div>
';
}
$output .='
<div class="col-md-6 col-lg-6 col-sm-12 col-xs-12 login-section">
<i class="icon-user-add"></i> ' . __("Ai deja un cont?", "theme_domain") . '
<a href="#" class="login-link-page">' . __('Autentifică-te acum', 'theme_domain') . '</a>
</div>
</div>
</div>
<div id="result_' . $rand_id . '" class="status-message"><p class="status"></p></div>
</div>';
$output .='</form>';
$output .='</div>';
Mai jos este funcția pe care o folosesc în prezent pe site-ul meu:
function mytheme_registration_save($user_id) {
if ( isset($_REQUEST['action']) && $_REQUEST['action'] == 'register' ) {
$random_password = wp_generate_password($length = 12, $include_standard_special_chars = false);
wp_set_password($random_password, $user_id);
$reg_user = get_user_by('ID', $user_id);
if ( isset($reg_user->roles) && (in_array('subscriber', $reg_user->roles) || in_array('editor', $reg_user->roles) || in_array('author', $reg_user->roles)) ) {
// Hook pentru emailul proprietarului site-ului
do_action('theme_domain_new_user_notification_site_owner', $reg_user->data->user_login, $reg_user->data->user_email);
// Hook pentru emailul utilizatorului normal
do_action('theme_domain_user_register', $reg_user, $random_password);
}
}
}
}

Ei bine, poți să-ți creezi propriul formular de login, lucru pe care l-am făcut și eu acum câțiva ani, dar este mai ușor să folosești un plugin. Există o mulțime de plugin-uri pentru asta, de exemplu: Auto login new user https://wordpress.org/plugins/auto-login-new-user-after-registration/; de asemenea, poți adăuga social login pe site-ul tău WordPress, acest lucru creează o înregistrare automată pe site-ul tău.

Mulțumesc pentru sugestie, Fernando, dar trebuie să o fac prin programare personalizată. Poate acest lucru va ajuta pe cineva.

Mulțumesc mult. Acum am reușit să folosesc propriul meu câmp de parolă, am folosit logica plugin-ului pentru a realiza acest lucru. Dar mai am o nelămurire: vreau să trimit un link de verificare utilizatorului și abia după ce va fi aprobat, să poată să se autentifice.

Pentru a adăuga o parolă personalizată în loc să genereze parola implicită, am folosit următorul cod pentru a adăuga un câmp de parolă în formularul meu:
//Adaugă Câmp Personalizat pentru Parolă
$output .= '<div class="col-md-12 col-lg-12 col-sm-12 col-xs-12">';
$output .='<label class="password">';
$cs_opt_array = array(
'id' => '',
'std' => __('Parolă', 'jobhunt'),
'cust_id' => 'user_pass' . $rand_id,
'cust_name' => 'pass1',
'cust_type' => 'password',
'classes' => 'form-control',
'extra_atr' => ' size="100" tabindex="101" placeholder="' . __('Parolă*', 'jobhunt') . '"',
'return' => true,
);
$output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);
$output .='</label>';
$output .= '</div>';
$output .= '<div class="col-md-12 col-lg-12 col-sm-12 col-xs-12">';
$output .='<label class="password">';
$cs_opt_array = array(
'id' => '',
'std' => __('Parolă', 'jobhunt'),
'cust_id' => 'user_pass' . $rand_id,
'cust_name' => 'pass2',
'cust_type' => 'password',
'classes' => 'form-control',
'extra_atr' => ' size="100" tabindex="101" placeholder="' . __('Repetă Parola*', 'jobhunt') . '"',
'return' => true,
);
$output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);
$output .='</label>';
$output .= '</div>';
//Sfârșit
După aceea, am validat aceste două câmpuri cu următorul cod:
if ( empty( $_POST['pass1'] ) || ! empty( $_POST['pass1'] ) && trim( $_POST['pass1'] ) == '' ) {
$json['type'] = "error";
$json['message'] = $cs_danger_html . __('<strong>EROARE</strong>: Câmpul pentru parolă este obligatoriu.') . $cs_msg_html;
echo json_encode($json);
exit();
}
if ( empty( $_POST['pass2'] ) || ! empty( $_POST['pass2'] ) && trim( $_POST['pass2'] ) == '' ) {
$json['type'] = "error";
$json['message'] = $cs_danger_html . __('<strong>EROARE</strong>: Câmpul pentru confirmarea parolei este obligatoriu.') . $cs_msg_html;
echo json_encode($json);
exit();
}
if ( $_POST['pass1'] != $_POST['pass2'] ) {
$json['type'] = "error";
$json['message'] = $cs_danger_html . __('<strong>EROARE</strong>: Câmpul pentru parolă și cel pentru confirmarea parolei nu coincid.') . $cs_msg_html;
echo json_encode($json);
exit();
}
$random_password = $_POST['pass1'];
După validare, este timpul să salvăm datele în baza de date și am folosit următorul cod pentru a salva parola introdusă:
function mytheme_registration_save($user_id) {
if ( isset($_REQUEST['action']) && $_REQUEST['action'] == 'register' ) {
$random_password = $_POST['pass1'];
wp_set_password($random_password, $user_id);
$reg_user = get_user_by('ID', $user_id);
if ( isset($reg_user->roles) && (in_array('subscriber', $reg_user->roles) || in_array('editor', $reg_user->roles) || in_array('author', $reg_user->roles)) ) {
// Site owner email hook
do_action('theme_domain_new_user_notification_site_owner', $reg_user->data->user_login, $reg_user->data->user_email);
// normal user email hook
do_action('theme_domain_user_register', $reg_user, $random_password);
}
}
}
}
Pentru trimiterea emailului de verificare, am găsit următorul link. Și a fost foarte util pentru mine. Link de Verificare Email Și mulțumesc mult lui Clay, autorul postării despre verificarea emailului.
Am folosit pur și simplu următorul cod în functions.php al temei mele:
function wc_registration_redirect( $redirect_to ) {
wp_logout();
wp_redirect( '/sign-in/?q=');
exit;
}
// când un utilizator se autentifică, vom verifica dacă emailul acestuia este verificat
function wp_authenticate_user( $userdata ) {
$isActivated = get_user_meta($userdata->ID, 'is_activated', true);
if ( !$isActivated ) {
$userdata = new WP_Error(
'inkfool_confirmation_error',
__( '<strong>EROARE:</strong> Contul tău trebuie activat înainte de a te putea autentifica. Poți retrimite emailul de activare făcând click <a href="/sign-in/?u='.$userdata->ID.'">aici</a>', 'inkfool' )
);
}
return $userdata;
}
// când un utilizator se înregistrează, trebuie să-i trimitem un email pentru a-și verifica contul
function my_user_register($user_id) {
// obține datele utilizatorului
$user_info = get_userdata($user_id);
// creează un cod md5 pentru verificare ulterioară
$code = md5(time());
// transformă-l într-un cod pentru a-l trimite utilizatorului prin email
$string = array('id'=>$user_id, 'code'=>$code);
// creează codul de activare și statusul de activare
update_user_meta($user_id, 'is_activated', 0);
update_user_meta($user_id, 'activationcode', $code);
// creează URL-ul
$url = get_site_url(). '/sign-in/?p=' .base64_encode( serialize($string));
// practic, vom edita aici pentru a face acest lucru mai frumos
$html = 'Te rugăm să dai click pe următorul link <br/><br/> <a href="'.$url.'">'.$url.'</a>';
// trimite un email către utilizator
wc_mail($user_info->user_email, __('Te rugăm să-ți activezi contul'), $html);
}
// avem nevoie de această funcție pentru a gestiona toate modificările făcute
function my_init(){
// verifică dacă primim mesajul de activare
if(isset($_GET['p'])){
$data = unserialize(base64_decode($_GET['p']));
$code = get_user_meta($data['id'], 'activationcode', true);
// verifică dacă codul dat este același cu al nostru
if($code == $data['code']){
// actualizează baza de date pentru procesul de activare
update_user_meta($data['id'], 'is_activated', 1);
wc_add_notice( __( '<strong>Succes:</strong> Contul tău a fost activat! ', 'inkfool' ) );
}else{
wc_add_notice( __( '<strong>Eroare:</strong> Activarea a eșuat, te rugăm să contactezi administratorul. ', 'inkfool' ) );
}
}
if(isset($_GET['q'])){
wc_add_notice( __( '<strong>Eroare:</strong> Contul tău trebuie activat înainte de a te putea autentifica. Te rugăm să verifici emailul.', 'inkfool' ) );
}
if(isset($_GET['u'])){
my_user_register($_GET['u']);
wc_add_notice( __( '<strong>Succes:</strong> Emailul de activare a fost retrimis. Te rugăm să verifici emailul.', 'inkfool' ) );
}
}
// gestionarea hook-urilor
add_action( 'init', 'my_init' );
add_filter('woocommerce_registration_redirect', 'wc_registration_redirect');
add_filter('wp_authenticate_user', 'wp_authenticate_user',10,2);
add_action('user_register', 'my_user_register',10,2);
