Permite utilizatorilor să seteze parola în timpul înregistrării

2 mar. 2017, 07:17:18
Vizualizări: 19K
Voturi: 3

Î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);
        }
    }
}
}
0
Toate răspunsurile la întrebare 2
4

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.

2 mar. 2017 07:39:01
Comentarii

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

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

@nitish-paswan secretul este în interiorul acestui plugin.

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

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.

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

Da, am văzut că ai folosit codul preluat din WooCommerce, dar plugin-ul pe care îl sugerez are același cod în fișierul user-verification.php; de asemenea, are un aspect frumos care poate fi integrat ca plugin.

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

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