Hace tiempo publicábamos cómo crear un formulario de registro de usuarios en WordPress, para permitir que nuevos usuarios se den de alta en nuestra web sin necesidad de pasar por el gestor. Publicamos ahora el código mejorado, más organizado y con alguna funcionalidad extra: se incluye el código para notificar por correo al administrador de la página el registro del nuevo usuario, y el envío también por correo de los datos de inicio de sesión al usuario. También se incluye la manera de rellenar campos personalizados del perfil, que hemos tenido que crear previamente.
El nuevo método es el mismo que utilizamos para permitir que un usuario inicie sesión y la abandone mediante un formulario:
- Alojar en un archivo el formulario de registro, por ejemplo en
user-forms.php
- Insertar en otro archivo las acción para registrarse, por ejemplo, en
user.php
. Este paso no es extrictamente necesario, pero hace que tengamos todo el código relativo a gestión de usuarios controlado en el mismo archivo, cuestión de orden. De esta manera podemos tener las acciones de registro, inicio y abandono de sesión en un mismo archivo, que podemos llamar cuando lo necesitemos. - Llamar al archivo
user.php
desde el archivoheader.php
para que así las acciones se ejecuten antes de cargar las cabeceras de la página y podamos redirigir convenientemente a la URL que queramos, y llamar al archivo user-forms.php desde el lugar en el que deseemos que aparezcan los formularios.
Formulario, user-forms.php
// la URL que contendrá la acción es la propia página que contiene el formulario $action_slug = $wp_query->query_vars['name']; // preparing errors if sign up form has been submited if ( isset($_POST['signup-submit']) ) { // if username is empty if ( $_POST['signup-username'] == '' || $_POST['signup-username'] == ' ' ) { $name_val = ''; $name_msg = "<span class="error"><strong>You must choose a username: with an empty field you are out of the game.</strong></span>"; $form_username_class = " error"; } elseif ( isset($user_exist) ) { // if username already exist $name_val = $_POST['signup-username']; $name_msg = "<span class="error"><strong>The username you have chosen already exists.</strong> Try something different.</span>"; $form_username_class = " error"; } else { // if username is ok $name_val = $_POST['signup-username']; $name_msg = ""; $form_username_class = ""; } if ( $_POST['signup-pass'] != $_POST['signup-pass2'] ) { // if the pass confirmation is not correct $pass_val = ""; $pass_msg = "<span class="error"><strong>There is any error in the password you have chosen. Try to type it again carefully.</strong></span> "; $form_pass_class = " error"; } else { $pass_val = ""; $pass_msg = ""; $form_pass_class = ""; } if ( $_POST['signup-mail'] == '' ) { // if mail field is empty $mail_val = ""; $mail_msg = "<span class="error"><strong>The mail address is a mandatory field. You will receive all your login data in this address.</strong></span> "; $form_mail_class = " error"; } elseif ( isset($mail_exist) ) { // if mail is already asociated to other user $mail_val = $_POST['signup-mail']; $mail_msg = "<span class="error"><strong>The mail address you have chosen is already associated to other user account.</strong> Try another different.</span> "; $form_mail_class = " error"; } else { $mail_val = $_POST['signup-mail']; $mail_msg = ""; $form_mail_class = ""; } if ( $_POST['signup-human'] != '13' ) { // is the user a robot? $human_val = $_POST['signup-human']; $human_msg = "<span class="error"><strong>Are you sure you are not a robot?</strong> We don't.</span> "; $form_human_class = " error"; } else { $human_val = $_POST['signup-human']; $human_msg = ""; $form_human_class = ""; } if ( $_POST['signup-conditions'] != 'accept' ) { // if legal conditions have not been accepted $conditions_val = "accept"; $conditions_msg = "<span class="error"><strong>You must read and accept the Legal and Privacy Advise to sign up.</strong></span> "; $form_conditions_class = " error"; } else { $conditions_val = "accept"; $conditions_msg = ""; $form_conditions_class = ""; } // catching all $_POST data $first_val = $_POST['signup-firstname']; $last_val = $_POST['signup-lastname']; $bio_val = $_POST['signup-bio']; $twitter_val = $_POST['signup-twitter']; $web_val = $_POST['signup-website']; $feed_val = $_POST['signup-feed']; $institution_val = $_POST['signup-institution']; } else { // if no errors, nothing } $signup_form = ' <form id="signup" action="' .$action_slug. '" method="post" name="signup"> <fieldset class="required' .$form_username_class. '"><span class="req">*</span> <input id="signup-username" type="text" name="signup-username" value="' .$name_val. '" /> <label>Username</label> <div class="mini-faq">" .$name_msg. "</div></fieldset> <fieldset><input id="signup-pass" type="password" name="signup-pass" value="" /> <label>Password</label> <div class="mini-faq"><strong>Choose a strong password</strong>, a good recipe could be a combination of characters and numbers with any capital letters. To make other people difficult to access to your account is always a good idea.</div></fieldset> <fieldset class="required' .$form_pass_class. '"><input id="signup-pass2" type="password" name="signup-pass2" value="" /> <label>Password confirmation</label> <div class="mini-faq">" .$pass_msg. "If you leave the password boxes empty, a random password will be sent to your email address.</div></fieldset> <fieldset class="required' .$form_mail_class. '"><span class="req">*</span> <input id="signup-mail" type="text" name="signup-mail" value="" .$mail_val. "" /> <label>E-mail</label> <div class="mini-faq">' .$mail_msg. '<strong>Spam is evil and you\'ll never see any from us</strong>. <strong>This address will not be shown in the web, of course!</strong></div></fieldset> <fieldset><input id="signup-firstname" type="text" name="signup-firstname" value="' .$first_val. '" /> <label>First name</label> <div class="mini-faq"><strong>All this information about (first and last names, description, institution...) you will appear next to your projects</strong> or other content you submit. You can complete it in any moment after sign up.</div></fieldset> <fieldset><input id="signup-lastname" type="text" name="signup-lastname" value="' .$last_val. '" /> <label>Last name</label></fieldset> <fieldset><textarea id="signup-bio" name="signup-bio" rows="10" cols="45">' .$bio_val. '</textarea> <label>Briefly about you</label></fieldset> <fieldset><input id="signup-institution" type="text" name="signup-institution" value="' .$institution_val. '" /> <label>Institution</label> <div class="mini-faq">Do you belong to any academic institution or other kind of organization?</div></fieldset> <fieldset><input id="signup-twitter" type="text" name="signup-twitter" value="' .$twitter_val. '" /> <label>Twitter account</label> <div class="mini-faq"><strong>Your twitter username</strong>.</div></fieldset> <fieldset><input id="signup-website" type="text" name="signup-website" value="' .$web_val. '" /> <label>Website</label></fieldset> <fieldset><input id="signup-feed" type="text" name="signup-feed" value="' .$feed_val. '" /> <label>Website Feed</label> <div class="mini-faq">Don\'t you know what a feed is? Have a look at <a href="http://en.wikipedia.org/wiki/Web_feed" target="_blank">Wikipedia</a>.</div></fieldset> <fieldset class="rem' .$form_conditions_class. '"><input id="signup-conditions" type="checkbox" name="signup-conditions" value="' .$conditions_val. '" /> <label>I have read the <a href="/privacy-advise" target="_blank">Legal and Privacy Advise</a> and I agree with it.</label> <div class="mini-faq">' .$conditions_msg. '</div></fieldset> <fieldset class="required' .$form_human_class. '"><input id="signup-human" type="text" name="signup-human" value="' .$human_val. '" /> <label>four plus nine?</label> <div class="mini-faq">' .$human_msg. '<strong>Prove that you are not a robot!</strong></div></fieldset> <fieldset><input id="sigup-ref" type="hidden" name="signup-ref" value="' .$ref. '" /> <input id="signup-submit" type="submit" name="signup-submit" value="Sign up" /></fieldset> </form> <!-- #signup --> ';
Acciones para registrarse, user.php
// to sign up a new user if ( isset($_POST['signup-submit']) ) { // catching all $_POST data $username = $_POST['signup-username']; $pass = $_POST['signup-pass']; $pass2 = $_POST['signup-pass2']; $mail = $_POST['signup-mail']; $firstname = $_POST['signup-firstname']; $lastname = $_POST['signup-lastname']; $bio = $_POST['signup-bio']; $twitter = $_POST['signup-twitter']; $website = $_POST['signup-website']; $feed = $_POST['signup-feed']; $conditions = $_POST['signup-conditions']; $institution = $_POST['signup-institution']; $human = $_POST['signup-human']; require_once(ABSPATH . WPINC . '/registration.php'); // testing errors $user_id = username_exists( $username ); $mail_id = email_exists($mail); if ( $user_id || $username == "" || $username == " " ) { // if username already exists or is empty global $user_exist; $user_exist = $user_id; $errore = "user"; } if ( $mail_id || $mail == "" ) { // if email is already associated to other user or is empty global $mail_exist; $mail_exist = $mail_id; $errore = "mail"; } if ( $pass != $pass2 ) { // if passwords don't match $errore = "pass"; } if ( $human != '13' ) { // if user is not human $errore = "robot"; } if ( $conditions != 'accept' ) { // if user didn't accept the legal advise $errore = "conditions"; if ( isset($errore) ) { // if there is any error, stop the proccess } else { // if no errors, do the sign up actions // if pass is empty, we generate a random one $random_pass = wp_generate_password( 12, false ); if ( $pass == '' ) { $pass = $random_pass; } $userdata = array( 'user_pass' => $pass, 'user_login' => $username, 'user_url' => $website, 'user_email' => $mail, 'first_name' => $firstname, 'last_name' => $lastname, 'description' => $bio, 'role' => 'contributor', 'twitter' => $twitter, 'feed' => $feed, ); $user_id = wp_insert_user( $userdata ); // to insert $twitter and $feed custom fields // (to create fields in functions.php is needed!) update_user_meta( $user_id, 'twitter', $twitter ); update_user_meta( $user_id, 'feed', $feed ); $success_msg = "<span class="error">You have sign up successfully. In order to submit any content, first of all <strong>you must log in using the form underneath.</strong></span>"; // to send confirmation mail to the new user $user_data = get_userdata( $user_id ); $to = $user_data->user_email; $subject = "Username and password to login in My Web"; $message = 'Hi ' .$user_data->user_login. ',' . "\r\n" . 'you have signed up succesfully in My Web. You can log in using your username ('.$user_data->user_login.') and password (' .$pass. '), here: http://example.net/' . "\r\n\r\n" . 'If you have forgotten your username or password, you can recover them here: http://example.net/wp-login.php?action=lostpassword'; $headers[] = 'From: My Web -- a funny and simple web '; wp_mail( $to, $subject, $message, $headers ); // to send a notification to web admin that a new user has sign up $to = 'info@example.net'; $subject = "New user has sign up in example.net"; $message = 'A new user has sign up in example.net: ' . "\r\n\r\n" . '+ '.$user_data->user_login. "\r\n\r\n" . $headers[] = 'From: My web -- a funny and simple web '; $headers[] = 'Cc: info@example.com'; wp_mail( $to, $subject, $message, $headers ); } // end testing errors // header("location: " .$redirect); } // end sign up proccess
Para poner en marcha el sistema de registro basta incluir el archivo con el formulario en la plantilla que queramos que aparezca, y llamar al archivo user.php en el header.php mediante un include
.
39 comentarios
Hola amigo, todo se ve bien, pero al ultimo no entendi lo de llamar al archivo con una funcion mediante include..
Me puedes ayudar con eso?
Para incluir un archivo PHP en otro basta recurrir a la orden include. Tienes información de cómo funciona en php.net.
Superior info concerning WordPress 3.4.2. Thanks so much for
posting.
Buenas,
Es la primera vez que comento, pero llevo tiempo siguiendo el blog y usando vuestros recursos. Enhorabuena por el trabajo y gracias, porque sin páginas como la vuestra mucha gente que se inicia estaríamos perdidos.
Una vez dicho esto, os hago mi consulta. Estoy usando vuestro código para crear un formulario de registro en una web con la que ando. El tema es que he añadido el user.php al header con un include y el user-forms.php a la plantilla de la página que pretendo usar para que la gente se registre. Al crear ambos php (user y user-forms) ya me parece sospechoso que en Dremweaver me salga todo el código en negro (como si faltara alguna etiqueta). Cuando lo subo todo, el resultado es que me sale todo el codigo directamente en pantalla. He probado a añadir las etiquetas php dentro de cada archivo, pero empiezan a aparecerme errores. He intentado solucionar los errores cambiando algunas comillas dobles por simples, pero sin resultado. (Aparentemente el archivo ya no da errores en dremweaver pero ni rastro del formulario en pantalla)
Pido disculpas por adelantado porque estoy seguro que es algo rídiculo.
Hola jose, nos alegramos de que encuentres voragine.net útil, gracias.
Para que el PHP sea interpretado como tal tienes que añadir al principio el siguiente código <?php y al final ?>, supongo que a eso te refieres con las etiquetas PHP. Que te salgan errores significa que el código está siendo interpretado como PHP.
Llegados a este punto, queda resolver los errores que vayas encontrando. Revisando el código que publiqué veo que hay varias comillas dobles que deberían ser sencillas, sí.
El archivo que contiene el formulario de registro no realiza el output. Para que se vea en pantalla tienes que hacer un echo de la variable que contiene el form. Añade un echo $signup_form donde quieras que aparezca.
Buenas tardes,
Finalmente usé un plugin para el registro y manejo de usuarios (WP-Members), porque no me dí cuenta de la respuesta :(. Me dejo anotada la solución para la siguiente revisión de la web, porque le he cogido cierta manía a eso de usar plugins con wordpress. Soy más de pegarme cabezazos por las esquinas hasta dar con la solución ;)
Muchas gracias de cualquier forma!
Hola.
Ciertamente es un sitio interesante, pero con este tipo de letra es prácticamente ilegible.
Muchas gracias por tu atención.
Gracias por el feedback, Juan Carlos. No eres el primero que nos lo dice. Tenemos pendiente el cambio de tipo en los cuerpos pequeños.
Estimado gracias por su ayuda con esta pagina…sirve de mucho!! estaba por usar tu formulario de registro , pero me arroja este error al momento de la carga
Parse error: parse error in C:\xampp\htdocs\wordpress\wp-content\themes\Cleanmag\user.php on line 74
que corresponde a este codigo
$success_msg = «You have sign up successfully. In order to submit any content, first of all you must log in using the form underneath.«;
me podiras ayduar por que me arroja el error
Gracias
Hola Manu, me alegro que te sea útil.
El error se produce por las comillas dobles que no están en el formato correcto.
Si estás usando un teclado español, tienes que usar las que salen al teclear SHIFT+2, no otras.
hola muy bueno todo tengo una duda ese código se puede usar en blogger o es solamente en word press
si fuese que se utiliza para ambas podrian decirme como lo ubico en blogger
Hola nahuel,
no, este código es para WordPress. No vale para blogger.
no existe uno para blogger se lo agradecería mucho!!!!!
No conozco mucho blogger, pero este tutorial cuenta cómo programar un sistema de registro de usuarios de cero, podríamos decir, para WordPress.
Creo que para blogger debe existir algún sistema que permita que los usuarios se registren en tu página, mediante algún módulo, plugin o similar.
Pero ya te digo que no conozco lo suficiente blogger como para poder ayudarte.
Hola. He visto tu artículo, pero estoy un poco confuso. La verdad es que soy nuevo en esto de WordPress, y me gustaría mucho poder crear un plugin de acceso/registro de usuarios, ya que los que he visto o no funcionan bien, o están con todos los textos en inglés, o no tienen formularios personalizables, o les faltan prestaciones.
Todos los archivos que mencionas en tu artículo ¿donde deben colocarse? ¿Cómo haríamos para incluir, como tiene algunas webs, la posibilidad de logearse con la cuenta de FB o de twitter? ¿Existe algún plugin que cumpla estas funciones? Yo he probado el Pie, el register plus redux, el sidebar, y no se cuantas cosas más y ninguno me ofrece esto.
Si me orientas un poco, no sabes como te lo agradeceré.
Hola Jose,
todos los archivos de los que hablo en el artículo han de colocarse en la carpeta del theme que vayas a usar.
Por otro lado, para registro con facebook, twitter y g+, puedes usar el plugin WordPress Social Login.
Hola, me gusta mucho lo que han hecho solo 2 preguntas
1) como es la linea del include user.php
2) como hago para generar un reporte con los datos que les pido a los usuarios y asi imprimirlo
se podra?
Hola eliezer,
si quieres saber cómo usar la directiva include de PHP, puedes revisar el manual de php.net: php.net/manual/en/function.include.php. Básicamente lo que hace es incluir el contenido de un fichero PHP en otro. La sintaxis es sencilla: include «file.php»;
En cuanto al reporte, dependerá de cómo trates y dónde almacenes los datos. Para responderte necesitaría algún detalle más.
Hola skotperez muy interesante el contenido de tu blog, me gustaria consultarte si es posible crear 3 formularios de registro que apunten a la misma base de datos de un sitio con buddypress, basicamente para categorizar 3 niveles de usuarios diferentes bien estructurados, profesionales, empresas y (visitantes normales o suscriptores) probe varios plugins y no consigo dar con lo que necesito, quisiera que cada formulario de registro apunte a una direccion url diferente para realizar publicidades especificas de cada categoria, por ejemplo una pagina donde publique los beneficios que podran optenes los profesionales que se suscriban a mi red donde incluiria el enlace al formulario de suscripcion para profesionales http://www.concienciafitnes.com/blog/profesionales y lo mismo para las demas categorias
desde ya gracias por tu tiempo
Hola Jose,
puedes crear tres páginas en las que incluyas el mismo formulario, y el contenido específico que consideres. La diferencia vendrá a la hora de insertar el usuario en la base de datos: lo que tienes que cambiar en cada caso es el parámetro role de la función wp_insert_user:
'role' => 'contributor'
, la que aparece en la línea 63 del bloque de código Acciones para registrarse.Consulta también los roles disponibles en WordPress.
Hola, he probado tus códigos, que me parecen geniales, pero ahora he perdido mi página.
Primero me daba una tabla con una serie de errores que he inentado corregir y lugo me sale este texto:
/** * Front to the WordPress application. This file doesn’t do anything, but loads * wp-blog-header.php which does and tells WordPress to load the theme. * * @package WordPress */ /** * Tells WordPress to load the WordPress theme and output it. * * @var bool */ define(‘WP_USE_THEMES’, true); /** Loads the WordPress Environment and Template */ require( dirname( __FILE__ ) . ‘/wp-blog-header.php’ );
Estoy perdida…. tengo una copia de seguridad que he hecho con XCloner pero tampoco sé como restaurarla….
Me encantaría poder poner tu formulario, pero si es mucho pedir, al menos, por favor, podrías ayudarme a recuperar la página….
Gracias y un saludo, María
Hola
Ayer escribí un comentario que hoy ya no encuentro.
Al instalar tu modelo de formulario me daba unos errores y al tratar de corregirlos perdí el acceso a la página. La he recuperado sacando los archivos del formulario de la plantilla (Cubby en wordpress) y sustituyendo los archivos que modifiqué por los originales que tengo en otro disco.
Ahora vuelve a funcionar, pero me encantaría porder incluri tu formulario porque me parece muy bien estructurado.
¿podrías ayudarme con esto?
Gracias, María.
Hola de nuevo…
Este es el tercer comentario que te envío y no sé dónde van porque no los veo.
Lo he vuelto a intentar y, al menos, no he perdido la página pero lo que me hace es que me saca en la portada de la página todo el código escrito en el archivo user.php
No sale un formulario, como era de esperar, sino que incluye literalmente el código del archivo.
Por favor…. échame una manita con esto…..
Gracias, María.
Y perdona mi insitencia.
Hola María, me alegro de que pudieses recuperar tu página.
A ver si puedo ayudarte: ¿Desde qué archivo estás llamando al archivo user.php? Tienes que llamarlo desde el archivo header.php del theme que estés usando.
Hola,
¿Podrías poner ejemplos, en líneas de código, si es posible, para aquellos que no manejamos programación? Dices que hay que ponerlo en tal carpeta y llamarlo desde tal archivo; sí, eso se entiende, ¿pero en qué lugar, exactamente, qué línea, después de qué, en qué etiqueta? Algo más completo, y no dejarlo al aire, gracias, de ante mano.
Hola Irudha,
el archivo user.php lo puedes incluir al principio del archivo header.php. El formulario… depende de dónde lo quieras mostrar. No puedo ser más específico porque cada archivo de cada theme es diferente.
Aunque si no sabes nada de programación te recomiendo que uses un plugin ya preparado para incluir el formulario de registro en tu wordpress.
Me podrian explicar como hago visible el formulario?
» incluir el archivo con el formulario en la plantilla que queramos que aparezca, y llamar al archivo user.php en el header.php mediante un include.»
no logro entender como lo hacen publico y donde lo incluyen oara que sea accesible.
Hola Gabri,
para llamar a un archivo desde otro se puede utilizar la orden include de la siguiente manera:
include "archivo.php"
No se si vio mi comentario anterior porque no lo veo ingresado. Respondame por favor si no lo vio para volver a formularlo
Hola Alejandro, no veo ningún otro comentario tuyo.
Hola y gracias por la atencion.
Despues de corregir la doble comilla en la la linea 74 del codigo en user.php e ingresar el include «user.php» con doble y con simple comillas que es como explican en php.net en header, sigo sin ver el formulario.
Inclui user.php y user-forms.php en la carpeta de mi tema con la copia fiel del codigo que pone en este tutorial, sin modificar ningun otro archivo de ninguna otra carpeta y sigo, como les dije sin ver nada.
Este es el codigo de mi header y casi al final esta agregado el incluide:
<?php
/**
* The Header for our theme.
*
* Displays all of the section and everything up until id=»main-core».
*
* @package ThinkUpThemes
*/
?>
<html >
<meta charset="» />
<link rel="pingback" href="» />
<script src="/lib/scripts/html5.js» type=»text/javascript»>
<body >
<img src="» width=»width ); ?>» height=»height ); ?>» alt=»»>
‘header-links’, ‘container_id’ => ‘pre-header-links-inner’, ‘theme_location’ => ‘pre_header_menu’ ) ); ?>
false, ‘theme_location’ => ‘header_menu’, ‘walker’ => new thinkup_menudescription() ) ); ?>
Espero su respuesta. Gracias
ESTE ES EL header.php COMPLETO QUE NO LO CARGO COMPLETO ANTES
<?php
/**
* The Header for our theme.
*
* Displays all of the section and everything up until id=»main-core».
*
* @package ThinkUpThemes
*/
?>
<html >
<meta charset="» />
<link rel="pingback" href="» />
<script src="/lib/scripts/html5.js» type=»text/javascript»>
<body >
<img src="» width=»width ); ?>» height=»height ); ?>» alt=»»>
‘header-links’, ‘container_id’ => ‘pre-header-links-inner’, ‘theme_location’ => ‘pre_header_menu’ ) ); ?>
false, ‘theme_location’ => ‘header_menu’, ‘walker’ => new thinkup_menudescription() ) ); ?>
Hola Alejandro,
para ver el formulario tienes que llamar al archivo user-form.php desde la plantilla de la página en la que quieras que aparezca. Por ejemplo si quieres que aparezca en las páginas lo llamaras desde page.php.
Hola skotperez, primero agradecerte el gran trabajo de estos posts.
Te comento que he seguido todos los pasos pero igualmente no consigo mostrar el formulario
No se si sea simplemente dentro de la plantilla escribir:
O es que haya que hacer algo más.
No entiendo cómo se muestra el formulario
Muchas gracias por tus respuestas
Perdón, el renglón que no se muestra es:
include ‘user-forms.php’;
quise poner las etiquetas de apertura y cierre de php, pero yo creo que por eso no se mostraron
Hola Luis,
para que aparezca el formulario tiene que hacer echo de la variable que lo contiene que, si no has cambiado su nombre, en el código de este post es $signup_form. Entonces:
echo $signup_form;
Muchas gracias skotperez, ya logré comprender el funcionamiento. Gracias por todo
Horne http://turbopages.orgHorne http://turbopages.org