Разрешить пользователям устанавливать пароль при регистрации

2 мар. 2017 г., 07:17:18
Просмотры: 19K
Голосов: 3

На моем сайте при каждой новой регистрации пользователь получает учетные данные (логин и пароль) по электронной почте.

Я хочу разрешить пользователям устанавливать свой пароль во время регистрации, после чего на их email будет отправлена ссылка для подтверждения.

Ниже приведен мой код, который нужно модифицировать:

<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="' . __('Имя пользователя*', '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' => __('Тип записи', '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' => __('Создать аккаунт', 'theme_domain'),
            'cust_id' => 'submitbtn' . $rand_id,
            'cust_name' => 'user-submit',
            'cust_type' => 'button',
            'extra_atr' => ' tabindex="103" onclick="javascript:show_alert_msg(\'' . __("Пожалуйста, выйдите из системы, прежде чем регистрироваться снова", "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' => __('Создать аккаунт', '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> ' . __("Уже есть аккаунт?", "theme_domain") . '
                        <a href="#" class="login-link-page">' . __('Войти сейчас', 'theme_domain') . '</a>
                    </div>
                </div>
                </div>
                <div id="result_' . $rand_id . '" class="status-message"><p class="status"></p></div>
                </div>';
    $output .='</form>';
    $output .='</div>';

Ниже приведена функция, которую я сейчас использую на сайте:

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)) ) {
            // Хук для отправки email владельцу сайта
            do_action('theme_domain_new_user_notification_site_owner', $reg_user->data->user_login, $reg_user->data->user_email);
            // Хук для отправки email обычному пользователю
            do_action('theme_domain_user_register', $reg_user, $random_password);
        }
    }
}
}
0
Все ответы на вопрос 2
4

Конечно, вы можете создать свою собственную форму входа, что я тоже делал несколько лет назад, но проще сделать это с помощью плагина. Существует множество таких плагинов, например: Auto login new user https://wordpress.org/plugins/auto-login-new-user-after-registration/; также вы можете добавить социальный вход в ваш WordPress, что обеспечит автоматическую регистрацию на вашем сайте.

2 мар. 2017 г. 07:39:01
Комментарии

Спасибо за предложение, Фернандо, но мне нужно сделать это через кастомное программирование. Возможно, это кому-то поможет.

Nitish Paswan Nitish Paswan
2 мар. 2017 г. 12:25:30

@nitish-paswan вся хитрость внутри этого плагина.

Fernando Baltazar Fernando Baltazar
2 мар. 2017 г. 19:22:23

Большое спасибо. Теперь я могу использовать свое собственное поле для пароля, я использовал логику плагина для этого. Но у меня есть еще один вопрос: я хочу отправлять ссылку для подтверждения пользователю, и только после одобрения он сможет войти в систему.

Nitish Paswan Nitish Paswan
3 мар. 2017 г. 09:05:13

Да, я видел, что вы взяли код из WooCommerce, но плагин, который я предлагаю, содержит такой же код в файле user verification.php; к тому же, он выглядит лучше для встраивания в виде плагина.

Fernando Baltazar Fernando Baltazar
9 мар. 2017 г. 08:25:33
0

Для добавления собственного пароля вместо генерации стандартного я использовал следующий код, чтобы добавить поле пароля в свою форму:

//Добавление пользовательского поля пароля
        $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' => __('Пароль', 'jobhunt'),
            'cust_id' => 'user_pass' . $rand_id,
            'cust_name' => 'pass1',
            'cust_type' => 'password',
            'classes' => 'form-control',
            'extra_atr' => ' size="100" tabindex="101" placeholder="' . __('Пароль*', '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' => __('Пароль', 'jobhunt'),
            'cust_id' => 'user_pass' . $rand_id,
            'cust_name' => 'pass2',
            'cust_type' => 'password',
            'classes' => 'form-control',
            'extra_atr' => ' size="100" tabindex="101" placeholder="' . __('Повторите пароль*', 'jobhunt') . '"',
            'return' => true,
        );
        $output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);

        $output .='</label>';
        $output .= '</div>';
        //Конец

После этого я проверил эти два поля с помощью следующего кода:

 if ( empty( $_POST['pass1'] ) || ! empty( $_POST['pass1'] ) && trim( $_POST['pass1'] ) == '' ) {
        $json['type'] = "error";
        $json['message'] = $cs_danger_html . __('<strong>ОШИБКА</strong>: Поле пароля обязательно для заполнения.') . $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>ОШИБКА</strong>: Поле подтверждения пароля обязательно для заполнения.') . $cs_msg_html;
         echo json_encode($json);
         exit();
        }
        if ( $_POST['pass1'] != $_POST['pass2'] ) {
            $json['type'] = "error";
            $json['message'] = $cs_danger_html . __('<strong>ОШИБКА</strong>: Пароль и подтверждение пароля не совпадают.') . $cs_msg_html;
            echo json_encode($json);
            exit();
        }

    $random_password = $_POST['pass1'];

После проверки пришло время сохранить данные в базе данных, и я использовал следующий код для сохранения введенного пароля:

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)) ) {
        // Хук для отправки email владельцу сайта
        do_action('theme_domain_new_user_notification_site_owner', $reg_user->data->user_login, $reg_user->data->user_email);
        // Хук для отправки email обычному пользователю
        do_action('theme_domain_user_register', $reg_user, $random_password);
    }
}
}
}

Теперь для отправки ссылки подтверждения я нашел следующую ссылку. И она оказалась очень полезной для меня. Ссылка для подтверждения email И огромное спасибо Клэю, автору поста о подтверждении email.

Я просто добавил следующее в functions.php своей темы:

function wc_registration_redirect( $redirect_to ) {
wp_logout();
wp_redirect( '/sign-in/?q=');
exit;
}
// при входе пользователя мы проверим, подтвержден ли его email
function wp_authenticate_user( $userdata ) {
$isActivated = get_user_meta($userdata->ID, 'is_activated', true);
if ( !$isActivated ) {
    $userdata = new WP_Error(
        'inkfool_confirmation_error',
        __( '<strong>ОШИБКА:</strong> Ваш аккаунт должен быть активирован перед входом. Вы можете повторно отправить письмо, нажав <a href="/sign-in/?u='.$userdata->ID.'">здесь</a>', 'inkfool' )
    );
}
return $userdata;
    }
// при регистрации пользователя мы отправим ему email для подтверждения аккаунта
function my_user_register($user_id) {
    // получаем данные пользователя
    $user_info = get_userdata($user_id);
    // создаем md5 код для последующей проверки
    $code = md5(time());
    // создаем код для отправки пользователю по email
    $string = array('id'=>$user_id, 'code'=>$code);
    // создаем код активации и статус активации
    update_user_meta($user_id, 'is_activated', 0);
    update_user_meta($user_id, 'activationcode', $code);
    // создаем URL
    $url = get_site_url(). '/sign-in/?p=' .base64_encode( serialize($string));
    // здесь мы можем улучшить сообщение
    $html = 'Пожалуйста, перейдите по следующей ссылке <br/><br/> <a href="'.$url.'">'.$url.'</a>';
    // отправляем email пользователю
    wc_mail($user_info->user_email, __('Пожалуйста, активируйте ваш аккаунт'), $html);
}
// обработка всех GET-параметров
function my_init(){
    // проверяем, получили ли мы сообщение об активации
    if(isset($_GET['p'])){
        $data = unserialize(base64_decode($_GET['p']));
        $code = get_user_meta($data['id'], 'activationcode', true);
        // проверяем, совпадает ли предоставленный код с нашим
        if($code == $data['code']){
            // обновляем базу данных по процессу активации
            update_user_meta($data['id'], 'is_activated', 1);
            wc_add_notice( __( '<strong>Успех:</strong> Ваш аккаунт был активирован! ', 'inkfool' )  );
        }else{
            wc_add_notice( __( '<strong>Ошибка:</strong> Активация не удалась, пожалуйста, свяжитесь с администратором. ', 'inkfool' )  );
        }
    }
    if(isset($_GET['q'])){
        wc_add_notice( __( '<strong>Ошибка:</strong> Ваш аккаунт должен быть активирован перед входом. Пожалуйста, проверьте вашу почту.', 'inkfool' ) );
    }
    if(isset($_GET['u'])){
        my_user_register($_GET['u']);
        wc_add_notice( __( '<strong>Успех:</strong> Письмо с подтверждением было отправлено повторно. Пожалуйста, проверьте вашу почту.', 'inkfool' ) );
    }
}
// обработчики хуков
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 мар. 2017 г. 13:38:08