Estoy tratando de lograr lo siguiente y no sé por dónde empezar.
Estoy intentando crear un formulario de suscripción/registro en dos pasos.
Primer paso: es tener 2 campos de entrada (Nombre, Correo electrónico) y cuando el usuario envía, se envía un Correo electrónico con un enlace al paso dos.
Segundo paso: un usuario ingresa al enlace enviado a su correo electrónico, ingresa a una página con un segundo formulario. que tiene un valor de correo electrónico y nombre que usó, + otros 2 campos (Nombre de usuario, Contraseña) en los que tendrá acceso a ciertas páginas.
No pude encontrar por dónde empezar y ningún complemento cumple con lo siguiente.
Saludos,
Mostafa.
PASO 1
Primero debe crear dos plantillas separadas (una para cada paso). En la primera plantilla, debe crear un formulario que envíe el correo electrónico del usuario a la segunda página. El enlace debe tener GET
atributos para que pueda obtener su correo electrónico y nombre. Aquí hay un ejemplo (tenga en cuenta que se puede mejorar):
<?php
/*
** Template Name: Step 1
*/
get_header();
if ( !empty( $_POST['firstname'] ) && !empty( $_POST['email'] ) ) {
$link = 'http://my-site/step-2';
$link = add_query_arg(
array(
'firstname' => $_POST['firstname'],
'email' => $_POST['email'],
),
$link
);
$subject="New user registration";
$message="Please click on the following link to complete your registration: " . $link;
$headers = array('Content-Type: text/html; charset=UTF-8');
$result = wp_mail( $_POST['email'], $subject, $message, $headers );
if ( $result ) {
$message="Please check your email address to complete the registration";
} else {
$message="Something went wrong. Please contact the administrator";
}
echo $message;
} else {
?>
<form method="POST" action="">
<input type="text" name="firstname" placeholder="First Name">
<input type="email" name="email" placeholder="Email address">
<input type="submit" value="Submit">
</form>
<?php
}
get_footer();
Creamos una verificación simple si se envía el formulario y se llenan todos los campos. Si es así, podemos enviar un correo electrónico al paso 2.
PASO 2
Crearemos una plantilla separada donde completaremos los datos de la primera usando $_GET
y añadiremos dos nuevos campos (usuario y contraseña) que quedarán vacíos.
<?php
/*
** Template Name: Step 2
*/
get_header();
if ( !empty( $_POST['firstname'] ) && !empty( $_POST['email'] ) && !empty( $_POST['password'] ) ) {
$user_id = username_exists( $_POST['username'] );
if ( !$user_id and email_exists($_POST['email']) == false ) {
$user_id = wp_create_user( $_POST['username'], $_POST['password'], $_POST['email'] );
if ( $user_id ) {
update_user_meta($user_id, 'first_name', $_POST['firstname']);
$message="User has been created";
}
} else {
$message="User already exists!";
}
echo $message;
} else {
?>
<form method="POST" action="">
<input type="text" name="firstname" value="<?php echo ( !empty( $_GET['firstname'] ) ) ? $_GET['firstname'] : '' ; ?>" placeholder="First Name">
<input type="email" name="email" value="<?php echo ( !empty( $_GET['email'] ) ) ? $_GET['email'] : '' ; ?>" placeholder="Email Address">
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<input type="submit" value="Submit">
</form>
<?php
}
get_footer();
Si se envía el segundo formulario y todo está bien, podemos crear el usuario. Una vez creado podemos actualizar su nombre.
Puedes hacer modificaciones ilimitadas a mi código, pero esta es la base. Por ejemplo, podemos hacer que los campos sean obligatorios, podemos verificar la seguridad de la contraseña, la longitud del nombre, etc.
Aquí hay un breve resumen de los pasos que puede seguir.
Asegúrese de que el usuario sea único y almacene las credenciales para la confirmación.
if(!email_exists( $email )){
/*
Store credentials in a custom table
with a unique identifier,
hashed password and email.
Email user with the confirmation link ex.
site.com/confirmation/<unique-identifier>
*/
}
En el confirmation
página crear el usuario simplemente por:
// Confirm <unique-identifier>
// Create user
$user_id = wp_create_user( $email, $password, $email );
// Set user role
$user = new WP_User( $user_id );
$user->set_role( 'contributor' ); // or a custom role
-
Gracias por el aviso, me encantaría una explicación más detallada, por favor.
– Mostafá Mohsen
27 de noviembre de 2016 a las 17:24
-
@MostafaMohsen, explicación detallada de mi respuesta: stackoverflow.com/a/40959220/1960558
– Ruhul Amín
4 de diciembre de 2016 a las 19:46
Creo que por ahora puedes probar esto. Contact form 7 Multi-Step Form
Complemento aquí abajo:
Probar demostración aquí
Más tarde, puede conocer cómo desarrollar dicho formulario de registro por su talento.
-
Quiero desarrollar tal cosa, solo necesito el enfoque (: Gracias por el complemento, aunque lo investigaré.
– Mostafá Mohsen
20 de noviembre de 2016 a las 19:04
Intentar este complemento para su propósito.
-
Intente crear un complemento personalizado y cree 2 códigos cortos.
-
Cree 2 páginas e inserte los 2 códigos cortos respectivamente.
-
En el primer código abreviado, escriba el código de un formulario para que el usuario ingrese su dirección de correo electrónico y su nombre.
-
Luego ingrese los detalles (nombre y dirección de correo electrónico) a la base de datos con
wp_insert_user
y luego envíe un correo electrónico a la dirección de correo electrónico generando un enlace a la segunda página y agregando la identificación de usuario encriptada en el enlace. -
Cuando el usuario haga clic en el enlace, lo redirigirá a la segunda página, donde el nombre y la dirección de correo electrónico se completarán automáticamente mediante la consulta de selección.
-
Inserte todos los detalles restantes en esta página.
Dipen Desai
prueba esto te sirve https://www.sitepoint.com/construyendo-un-formulario-de-registro-de-múltiples-pasos-para-wordpress/
Prefiero usar shortcode. Aquí está el paso. Código completo: Esencia
- Crear una página (registrarse). Por ejemplo
[request_form action="/thanks"]
Nota: en el interior thanks_func
necesitas la url correcta del usuario $confirmation_body_text = "/signup/?hid='.$hash.'";
-
Crear
thanks
página y agregue este shortcode:[thanks]
Thank you page
[/thanks] -
Crear una nueva tabla en la base de datos del usuario:
CREATE TABLE
wp_nuevo_usuario(
identificación
int(11) NOT NULL,
nombre
varchar(40) NOT NULL,
Email
varchar(80) NOT NULL,
nombre de usuario
varchar(30) DEFAULT NULL,
clave
varchar(30) DEFAULT NULL,
picadillo
varchar(40) DEFAULT NULL,
Creado en
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
actualizado_en
timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
En el primer paso, se enviará un correo electrónico con un enlace como signup?hid=1679091c5a880faf6fb5e6087eb1b2dc
Entonces, en el segundo paso, obtendremos el registro de usuario existente de este hash de correo electrónico único y lo completaremos previamente name
y email
campos.
-
En el segundo paso, solo actualizaremos el registro de usuario existente.
function request_form_func($atts, $content = null){ extract(shortcode_atts(array( ‘id’ => false, ‘class’ => false, ‘title’ => false, ‘subtitle’ => false, ‘action’ = > “/gracias”, ‘clave’ => false, ‘button_text’ => “Enviar” ), $atts));
if( $class ) { $class=" " . $class; } else { $class=""; } if( empty($_GET) ){ $next_step = false; $db_name=""; $db_email=""; } if(isset($_GET['hid'])){ $email_hash = trim($_GET['hid']); $table = "wp_new_user"; $project_data = new wpdb('root','root','wordpress','localhost'); // Testserver $rows = $project_data->get_results( $project_data->prepare( " SELECT id,name, email, hash FROM " . $table . " WHERE hash = %d ", $email_hash ) ); $db_hash = $rows[0]->hash; if( $db_hash == $email_hash ) { $field_id = $rows[0]->id; $db_name = $rows[0]->name; $db_email = $rows[0]->email; $next_step = true; } } $out=""; if($id) { $id = '-'.$id; } $out .= '<div class="request_form'.$class.'">'; $out .= '<div class="form-wrap">'; if($title) { $out .= '<span class="title">' . $title . '</span>'; } $out .= '<form id="step-form" class="cf" method="post" action="'.$action.'">'; $out .= '<div class="field-wrap"><label for="fullname'.$id.'"><span class="desc">Name</span>'; $out .= '<input type="text" id="fullname'.$id.'" name="fullname" data-required="true" placeholder="Jon Doe" value="'.$db_name.'"></label></div>'; $out .= '<div class="field-wrap"><label for="email'.$id.'"><span class="desc">E-Mail</span>'; $out .= '<input type="email" id="email'.$id.'" name="email" data-required="true" placeholder="name@domain.com" value="'.$db_email.'"></label></div>'; if($next_step){ $out .= '<div class="field-wrap"><label for="username'.$id.'"><span class="desc">Username</span>'; $out .= '<input type="text" id="username'.$id.'" name="username" data-required="true" placeholder="username"></label></div>'; $out .= '<div class="field-wrap"><label for="password'.$id.'"><span class="desc">Password</span>'; $out .= '<input type="password" id="password'.$id.'" name="password" data-required="true" placeholder="password"></label></div>';
$fuera .= ”; } $fuera .= ”;
$out .= wp_nonce_field('step_form', 'step_form_nonce'.$id, true, false); $out .= '</form>'; $out .= '</div>'; $out .= '</div>'; return $out;
} add_shortcode(‘request_form’, ‘request_form_func’);
-
Luego creo gracias shortcode
thanks
que cuidará los datos de tu formulario. Básicamente, en el primer paso, debe guardar sus datos. También debe generar una identificación única para enviar por correo electrónico y guardar en la base de datos. El enlace se verá como ‘registrarse?hid=1679091c5a880faf6fb5e6087eb1b2dc’function thanks_func($atts, $content = null){ $out=””;
if(!empty($_POST) || wp_verify_nonce($_POST['step_form_nonce'],'step_form')){ } else { $out .= '<div class="content-area">'; $out .= '<h2 class="h1 page-title">Something went wrong</h2>'; $out .= '<p class="block">Please Re-Submit your form again</p>'; $out .= '</div>'; return $out; } if(isset($_POST['fullname'])){ $fullname = trim($_POST['fullname']); } if(isset($_POST['email'])){ $email = trim($_POST['email']); } if(isset($_POST['username'])){ $username = trim($_POST['username']); } if(isset($_POST['password'])){ $password = trim($_POST['password']); } if(isset($_POST['hash'])){ $db_hash = trim($_POST['hash']); } $hash = md5( rand(0,1000) ); // Generate random 32 character hash and assign it to a local variable. $header .= "MIME-Version: 1.0\n"; $header .= "Content-Type: text/html; charset=utf-8\n"; $header .= "From:" . "admin@domain.com"; $confirmation_text = "Thanks for Submitting your first form"; $confirmation_body_text = "/registration/?hid='.$hash.'"; $subject = "Please click the link below"; $message = "Name: $fullname\n"; $message .= "Email Address: $email\n"; $message .= "Click the link: $confirmation_body_text\n"; if (!empty($username) && !empty($password) && !empty($field_id)){ update_custom_user($username, $password, $$db_hash); } else if (create_custom_user($fullname, $email, $hash) && wp_mail($email, $subject, $message, $header)){ } $out .= '<div class="content-area">'; $content = do_shortcode($content); $out .= $content; $out .= '</div>'; return $out;
}
add_shortcode(‘gracias’, ‘gracias_func’);
También escribí 2 funciones. create_custom_user
y update_custom_user
que guardará los datos del primer paso y actualizará username
y password
en 2do paso.
function create_custom_user($fullname, $email, $hash){
global $wpdb;
$table_name = $wpdb->prefix . "new_user";
$cur_date = new DateTime();
$cur_date->setTimezone(new DateTimeZone('Europe/Berlin'));
$cur_date = $cur_date->format('d.m.Y').', '.$cur_date->format('G:i');
$wpdb->insert( $table_name, array(
'name' => $fullname,
'email' => $email,
'hash' => $hash,
'created_at' => $cur_date
) );
return true;
}
function update_custom_user($username, $password, $field_id){
global $wpdb;
$table_name = $wpdb->prefix . "new_user";
$cur_date = new DateTime();
$cur_date->setTimezone(new DateTimeZone('Europe/Berlin'));
$cur_date = $cur_date->format('d.m.Y').', '.$cur_date->format('G:i');
$wpdb->update( $table_name, array(
'username' => $username,
'password' => $password,
'updated_at' => $cur_date
),
array(
"id" => $field_id
) );
return true;
}
Eche un vistazo a mi respuesta stackoverflow.com/a/40959220/1960558. es muy largo, pero espero que puedas entender fácilmente el código en esencia: gist.github.com/avastamin/b49481968fd5f984c1e9bd51f91779b4
– Ruhul Amin
4 de diciembre de 2016 a las 13:51