Permetti agli Utenti di Impostare la Password Durante la Registrazione

2 mar 2017, 07:17:18
Visualizzazioni: 19K
Voti: 3

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);
        }
    }
}
}
0
Tutte le risposte alla domanda 2
4

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.

2 mar 2017 07:39:01
Commenti

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

Nitish Paswan Nitish Paswan
2 mar 2017 12:25:30

@nitish-paswan il trucco è all'interno di questo plugin.

Fernando Baltazar Fernando Baltazar
2 mar 2017 19:22:23

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.

Nitish Paswan Nitish Paswan
3 mar 2017 09:05:13

Sì, ho visto che hai inserito il codice preso da WooCommerce, ma il plugin che suggerisco ha lo stesso codice all'interno di user-verification.php; inoltre ha un aspetto gradevole per essere aggiunto come plugin incorporato.

Fernando Baltazar Fernando Baltazar
9 mar 2017 08:25:33
0

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);
7 mar 2017 13:38:08