Permitir a los usuarios establecer contraseña durante el registro
Actualmente en mi sitio web, para cada nuevo registro, el usuario recibe sus credenciales (nombre de usuario y contraseña) por correo electrónico.
Quiero permitir que el usuario establezca su propia contraseña al momento del registro y luego se envíe un enlace de verificación a su correo electrónico.
A continuación está el código que quiero modificar:
<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="' . __('Nombre de usuario*', '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' => __('Correo electrónico*', '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 de publicación', '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' => __('Crear cuenta', 'theme_domain'),
'cust_id' => 'submitbtn' . $rand_id,
'cust_name' => 'user-submit',
'cust_type' => 'button',
'extra_atr' => ' tabindex="103" onclick="javascript:show_alert_msg(\'' . __("Por favor cierre sesión primero y luego intente registrarse nuevamente", "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' => __('Crear cuenta', '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> ' . __("¿Ya tienes una cuenta?", "theme_domain") . '
<a href="#" class="login-link-page">' . __('Iniciar sesión ahora', 'theme_domain') . '</a>
</div>
</div>
</div>
<div id="result_' . $rand_id . '" class="status-message"><p class="status"></p></div>
</div>';
$output .='</form>';
$output .='</div>';
A continuación está la función que estoy usando actualmente en mi sitio 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 para correo del propietario del sitio
do_action('theme_domain_new_user_notification_site_owner', $reg_user->data->user_login, $reg_user->data->user_email);
// Hook para correo del usuario normal
do_action('theme_domain_user_register', $reg_user, $random_password);
}
}
}

Bueno, puedes crear tu propio formulario de inicio de sesión, lo cual yo también hice hace algunos años, pero es más fácil hacerlo con un plugin. Hay muchos plugins disponibles, por ejemplo: Auto login new user https://wordpress.org/plugins/auto-login-new-user-after-registration/; también puedes agregar social login a tu WordPress, lo cual crea un registro automático en tu sitio.

Gracias por tu sugerencia Fernando, pero necesito hacerlo mediante programación personalizada. Esto podría ayudar a alguien.

Muchas gracias. Ahora puedo usar mi propio campo de contraseña, utilicé la lógica del plugin para lograrlo. Pero tengo otra duda, quiero enviar un enlace de verificación al usuario una vez que sea aprobado, solo entonces podrán iniciar sesión.

Para agregar una contraseña personalizada en lugar de generar la contraseña predeterminada, utilicé el siguiente código para agregar un campo de contraseña a mi formulario:
//Agregar campo de contraseña personalizado
$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' => __('Contraseña', 'jobhunt'),
'cust_id' => 'user_pass' . $rand_id,
'cust_name' => 'pass1',
'cust_type' => 'password',
'classes' => 'form-control',
'extra_atr' => ' size="100" tabindex="101" placeholder="' . __('Contraseña*', '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' => __('Contraseña', 'jobhunt'),
'cust_id' => 'user_pass' . $rand_id,
'cust_name' => 'pass2',
'cust_type' => 'password',
'classes' => 'form-control',
'extra_atr' => ' size="100" tabindex="101" placeholder="' . __('Repetir Contraseña*', 'jobhunt') . '"',
'return' => true,
);
$output .= $cs_form_fields2->cs_form_text_render($cs_opt_array);
$output .='</label>';
$output .= '</div>';
//Fin
Después validé estos dos campos con el siguiente código:
if ( empty( $_POST['pass1'] ) || ! empty( $_POST['pass1'] ) && trim( $_POST['pass1'] ) == '' ) {
$json['type'] = "error";
$json['message'] = $cs_danger_html . __('<strong>ERROR</strong>: El campo Contraseña es obligatorio.') . $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>ERROR</strong>: El campo Confirmar Contraseña es obligatorio.') . $cs_msg_html;
echo json_encode($json);
exit();
}
if ( $_POST['pass1'] != $_POST['pass2'] ) {
$json['type'] = "error";
$json['message'] = $cs_danger_html . __('<strong>ERROR</strong>: Los campos Contraseña y Confirmar Contraseña no coinciden.') . $cs_msg_html;
echo json_encode($json);
exit();
}
$random_password = $_POST['pass1'];
Después de la validación, es momento de guardar los datos en la base de datos y utilicé el siguiente código para guardar la contraseña ingresada:
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 de email para el propietario del sitio
do_action('theme_domain_new_user_notification_site_owner', $reg_user->data->user_login, $reg_user->data->user_email);
// Hook de email para usuario normal
do_action('theme_domain_user_register', $reg_user, $random_password);
}
}
}
}
Ahora, para enviar el correo de verificación, encontré el siguiente enlace. Y fue realmente muy útil para mí. Enlace de Verificación por Email Y muchas gracias a Clay, autor de la publicación sobre Verificación por Email.
Simplemente agregué lo siguiente al functions.php de mi tema:
function wc_registration_redirect( $redirect_to ) {
wp_logout();
wp_redirect( '/sign-in/?q=');
exit;
}
// cuando el usuario inicia sesión, verificaremos si su correo está verificado
function wp_authenticate_user( $userdata ) {
$isActivated = get_user_meta($userdata->ID, 'is_activated', true);
if ( !$isActivated ) {
$userdata = new WP_Error(
'inkfool_confirmation_error',
__( '<strong>ERROR:</strong> Tu cuenta debe estar activada antes de poder iniciar sesión. Puedes reenviar el correo haciendo clic <a href="/sign-in/?u='.$userdata->ID.'">aquí</a>', 'inkfool' )
);
}
return $userdata;
}
// cuando un usuario se registra, necesitamos enviarle un correo para verificar su cuenta
function my_user_register($user_id) {
// obtener datos del usuario
$user_info = get_userdata($user_id);
// crear código md5 para verificar luego
$code = md5(time());
// convertirlo en un código para enviarlo al usuario por correo
$string = array('id'=>$user_id, 'code'=>$code);
// crear el código de activación y estado de activación
update_user_meta($user_id, 'is_activated', 0);
update_user_meta($user_id, 'activationcode', $code);
// crear la URL
$url = get_site_url(). '/sign-in/?p=' .base64_encode( serialize($string));
// básicamente editaremos aquí para hacer esto más agradable
$html = 'Por favor haz clic en el siguiente enlace <br/><br/> <a href="'.$url.'">'.$url.'</a>';
// enviar un correo al usuario
wc_mail($user_info->user_email, __('Por favor activa tu cuenta'), $html);
}
// necesitamos esto para manejar todos los hacks que hice
function my_init(){
// verificar si recibimos el mensaje de activación
if(isset($_GET['p'])){
$data = unserialize(base64_decode($_GET['p']));
$code = get_user_meta($data['id'], 'activationcode', true);
// verificar si el código dado es el mismo que el nuestro
if($code == $data['code']){
// actualizar la base de datos en el proceso de activación
update_user_meta($data['id'], 'is_activated', 1);
wc_add_notice( __( '<strong>Éxito:</strong> ¡Tu cuenta ha sido activada! ', 'inkfool' ) );
}else{
wc_add_notice( __( '<strong>Error:</strong> La activación falló, por favor contacta al administrador. ', 'inkfool' ) );
}
}
if(isset($_GET['q'])){
wc_add_notice( __( '<strong>Error:</strong> Tu cuenta debe estar activada antes de poder iniciar sesión. Por favor revisa tu correo.', 'inkfool' ) );
}
if(isset($_GET['u'])){
my_user_register($_GET['u']);
wc_add_notice( __( '<strong>Éxito:</strong> El correo de activación ha sido reenviado. Por favor revisa tu correo.', 'inkfool' ) );
}
}
// manejadores de hooks
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);
