Разрешить пользователям устанавливать пароль при регистрации
На моем сайте при каждой новой регистрации пользователь получает учетные данные (логин и пароль) по электронной почте.
Я хочу разрешить пользователям устанавливать свой пароль во время регистрации, после чего на их 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);
}
}
}
}

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

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

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

Для добавления собственного пароля вместо генерации стандартного я использовал следующий код, чтобы добавить поле пароля в свою форму:
//Добавление пользовательского поля пароля
$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);
