Permetti agli Utenti di Impostare la Password Durante la Registrazione
Attualmente nel mio sito web, per ogni nuova registrazione, l'utente riceve le credenziali (username e password) via email.
Voglio permettere all'utente di impostare la propria password al momento della registrazione e successivamente inviare un link di verifica email al suo indirizzo email.
Di seguito il codice che desidero modificare:
<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="' . __('Username*', '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' => __('Tipo di 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' => __('Crea Account', 'theme_domain'),
'cust_id' => 'submitbtn' . $rand_id,
'cust_name' => 'user-submit',
'cust_type' => 'button',
'extra_atr' => ' tabindex="103" onclick="javascript:show_alert_msg(\'' . __("Effettua prima il logout e poi prova a registrarti di nuovo", "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' => __('Crea Account', '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> ' . __("Hai già un account?", "theme_domain") . '
<a href="#" class="login-link-page">' . __('Accedi ora', 'theme_domain') . '</a>
</div>
</div>
</div>
<div id="result_' . $rand_id . '" class="status-message"><p class="status"></p></div>
</div>';
$output .='</form>';
$output .='</div>';
Di seguito la funzione che attualmente utilizzo nel mio sito web:
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 email per il proprietario del sito
do_action('theme_domain_new_user_notification_site_owner', $reg_user->data->user_login, $reg_user->data->user_email);
// Hook email per l'utente normale
do_action('theme_domain_user_register', $reg_user, $random_password);
}
}
}
}

Beh, puoi creare il tuo modulo di login, cosa che ho fatto anch'io alcuni anni fa, ma è più semplice farlo con un plugin. Ci sono molti plugin disponibili, ad esempio: Auto login new user https://wordpress.org/plugins/auto-login-new-user-after-registration/; puoi anche aggiungere il social login al tuo WordPress, che crea una registrazione automatica sul tuo sito.

Grazie per il tuo suggerimento Fernando, ma ho bisogno di farlo tramite programmazione personalizzata. Forse questo aiuterà qualcuno.

Molte grazie. Ora riesco a utilizzare il mio campo password personale, ho usato la logica del plugin per ottenere questo risultato. Ma ho un altro dubbio, cioè voglio inviare un link di verifica all'utente e solo una volta che sarà approvato potrà effettuare il login.

Per aggiungere una password personalizzata invece di generare quella predefinita, ho utilizzato il seguente codice per aggiungere un campo password al mio modulo:
//Aggiungi Campo Password Personalizzato
$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' => __('Password', 'jobhunt'),
'cust_id' => 'user_pass' . $rand_id,
'cust_name' => 'pass1',
'cust_type' => 'password',
'classes' => 'form-control',
'extra_atr' => ' size="100" tabindex="101" placeholder="' . __('Password*', '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' => __('Password', 'jobhunt'),
'cust_id' => 'user_pass' . $rand_id,
'cust_name' => 'pass2',
'cust_type' => 'password',
'classes' => 'form-control',
'extra_atr' => ' size="100" tabindex="101" placeholder="' . __('Ripeti Password*', 'jobhunt') . '"',
'return' => true,
);
$output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);
$output .='</label>';
$output .= '</div>';
//Fine
Dopodiché ho validato questi due campi con il seguente codice:
if ( empty( $_POST['pass1'] ) || ! empty( $_POST['pass1'] ) && trim( $_POST['pass1'] ) == '' ) {
$json['type'] = "error";
$json['message'] = $cs_danger_html . __('<strong>ERRORE</strong>: Il campo Password è obbligatorio.') . $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>ERRORE</strong>: Il campo Conferma Password è obbligatorio.') . $cs_msg_html;
echo json_encode($json);
exit();
}
if ( $_POST['pass1'] != $_POST['pass2'] ) {
$json['type'] = "error";
$json['message'] = $cs_danger_html . __('<strong>ERRORE</strong>: Il campo Password e Conferma Password non corrispondono.') . $cs_msg_html;
echo json_encode($json);
exit();
}
$random_password = $_POST['pass1'];
Dopo la validazione è il momento di salvare i dati nel database e ho usato il seguente codice per salvare la password inserita:
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)) ) {
// Hook email proprietario sito
do_action('theme_domain_new_user_notification_site_owner', $reg_user->data->user_login, $reg_user->data->user_email);
// Hook email utente normale
do_action('theme_domain_user_register', $reg_user, $random_password);
}
}
}
}
Ora per inviare l'email di verifica ho trovato il seguente link. Ed è stato davvero molto utile per me. Link Verifica Email E molti grazie a Clay autore del post sulla Verifica Email.
Ho semplicemente utilizzato il seguente nel functions.php del mio tema
function wc_registration_redirect( $redirect_to ) {
wp_logout();
wp_redirect( '/sign-in/?q=');
exit;
}
// quando l'utente effettua il login, verificheremo se la sua email è verificata
function wp_authenticate_user( $userdata ) {
$isActivated = get_user_meta($userdata->ID, 'is_activated', true);
if ( !$isActivated ) {
$userdata = new WP_Error(
'inkfool_confirmation_error',
__( '<strong>ERRORE:</strong> Il tuo account deve essere attivato prima di poter effettuare il login. Puoi rinviare l\'email cliccando <a href="/sign-in/?u='.$userdata->ID.'">qui</a>', 'inkfool' )
);
}
return $userdata;
}
// quando un utente si registra dobbiamo inviargli un'email per verificare il suo account
function my_user_register($user_id) {
// ottieni i dati utente
$user_info = get_userdata($user_id);
// crea un codice md5 per la verifica successiva
$code = md5(time());
// crea un codice da inviare all'utente via email
$string = array('id'=>$user_id, 'code'=>$code);
// crea il codice di attivazione e lo stato di attivazione
update_user_meta($user_id, 'is_activated', 0);
update_user_meta($user_id, 'activationcode', $code);
// crea l'url
$url = get_site_url(). '/sign-in/?p=' .base64_encode( serialize($string));
// modificheremo qui per renderlo più carino
$html = 'Clicca sui seguenti link <br/><br/> <a href="'.$url.'">'.$url.'</a>';
// invia un'email all'utente
wc_mail($user_info->user_email, __('Attiva il tuo account'), $html);
}
// serve per gestire tutte le modifiche che ho fatto
function my_init(){
// verifica se riceviamo il messaggio di attivazione
if(isset($_GET['p'])){
$data = unserialize(base64_decode($_GET['p']));
$code = get_user_meta($data['id'], 'activationcode', true);
// verifica se il codice fornito è lo stesso del nostro
if($code == $data['code']){
// aggiorna il db sul processo di attivazione
update_user_meta($data['id'], 'is_activated', 1);
wc_add_notice( __( '<strong>Successo:</strong> Il tuo account è stato attivato! ', 'inkfool' ) );
}else{
wc_add_notice( __( '<strong>Errore:</strong> Attivazione fallita, contatta l\'amministratore. ', 'inkfool' ) );
}
}
if(isset($_GET['q'])){
wc_add_notice( __( '<strong>Errore:</strong> Il tuo account deve essere attivato prima di poter effettuare il login. Controlla la tua email.', 'inkfool' ) );
}
if(isset($_GET['u'])){
my_user_register($_GET['u']);
wc_add_notice( __( '<strong>Successo:</strong> L\'email di attivazione è stata rinviata. Controlla la tua email.', 'inkfool' ) );
}
}
// gestori degli hook
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);
