Inici > Programació, Web > Registro de usuarios externo a WordPress

Registro de usuarios externo a WordPress

diumenge, 11 de gener de 2009 Imprimir

Nota: Esta entrada se refiere a la versión de WordPress 2.6.x. Es posible que estos métodos esten obsoletos -y por ello no funcione- en versiones más recientes de WP.

Estos días me estoy dedicando (entre otras cosas…) a unificar el registro de usuarios de la página www.underave.net debido a que utilizamos distintas plataformas PHP (phpBB, WordPress y MediaWiki).

En este post explicaré cómo registrar usuarios desde un formulario externo a WordPress.

Pero explicaré lo justo y necesario (es decir, únicamente el código requerido para registrar los usuarios tras mandar los datos vía POST desde un formulario), como siempre, todo lo demás lo podéis encontrar fácilmente utilizando google.


Empecemos…

Como he dicho doy por hecho que sabéis hacer un formulario de envío de datos POST. Por si acaso aquí tenéis una útil ayuda:

Enviando y recibiendo datos con GET y POST utilizando HTML y PHP

Primero de todo debemos cargar los ficheros necesarios para utilizar las funciones de wordpress:

require_once("../blog/wp-config.php");
require_once("../blog/wp-includes/registration.php");

Donde “../blog/” corresponde a la ruta relativa de vuestro WordPress.

Una vez añadidos los ficheros necesarios (wp-config.php carga las variables de WordPress y algunos ficheros necesarios y el fichero registration.php nos permite utilizar las funciones de registro de usuarios) tan solo tenemos que llamar a la función para registrar usuarios. Tenemos dos opciones: la sencilla (wp_create_user) con sólo dos parámetros y la compleja (wp_insert_user) dónde le podemos pasar todos los detalles del usuario en un array asociativo.

Simple:

wp_create_user($_POST['usuario'],$_POST['contrasenya'],$_POST['email']);

Compleja (podéis ver todas las variables posibles en el Codex de WordPress):

// Rellenamos un array con los datos que queramos añadir
$datos = array("user_login"=>$_POST['nick'], // Nombre de usuario para login
"user_pass"=>$_POST['pass'], // Contraseña
"user_url"=>$_POST['url'], // Website del usuario
"user_email"=>$_POST['email'], // E-mail
"display_name"=>$_POST['nick'], // Nombre a mostrar del usuario en comentarios y mensajes
"first_name "=>$_POST['nombre'], // Nombre del usuario
"last_name"=>$_POST['apellidos'], // Apellidos
"role"=>"contributor");
// Insertamos los datos
wp_insert_user($datos);

Fijaros en la propiedad “role”. Es para designar los permisos del usuario (que podéis consultar en esta página). Si no la ponéis pondrá la que tengáis por defecto configurada en el blog.

Ambas funciones retornan el ID resultante al registrar al usuario, lo que nos puede servir para enviar una activación por e-mail de la cuenta (por ejemplo…).

Pues ya lo tenéis, vuestro sistema de registro de usuarios de WordPress. Seguramente dentro de poco me anime a publicar un post para hacer vuestro propio sistema de login. También publicaré un post para registrar usuarios en phpBB.

A continuación os dejo el código completo para ambas funciones (para hacer copy paste más rápido 😉 ):

Simple..

// Añadimos los ficheros necesarios
require_once("../blog/wp-config.php");
require_once("../blog/wp-includes/registration.php");
// Insertamos los datos
wp_create_user($_POST['usuario'],$_POST['contrasenya'],$_POST['email']);
// $id_usuario = wp_create_user($_POST['usuario'],$_POST['contrasenya'],$_POST['email']);

Compleja..

// Añadimos los ficheros necesarios
require_once("../blog/wp-config.php");
require_once("../blog/wp-includes/registration.php");
// Rellenamos un array con los datos que queramos añadir
$datos = array("user_login"=>$_POST['nick'], // Nombre de usuario para login
"user_pass"=>$_POST['pass'], // Contraseña
"user_url"=>$_POST['url'], // Website del usuario
"user_email"=>$_POST['email'], // E-mail
"display_name"=>$_POST['nick'], // Nombre a mostrar del usuario en comentarios y mensajes
"first_name "=>$_POST['nombre'], // Nombre del usuario
"last_name"=>$_POST['apellidos'], // Apellidos
"role"=>"contributor");
// Insertamos los datos
wp_insert_user($datos);
// $id_usuario = wp_insert_user($datos)

Páginas de referencia:

  1. Daniel
    diumenge, 1 de març de 2009 a les 17:25 | #1

    sabes como hacer un registro de usuarios pero sin PHP, solo java/javascript… si sabes por favor ayudame!!

  2. dissabte, 4 d'abril de 2009 a les 13:31 | #2

    Soy un completo ignorante de código pero me estoy peleando con estas cosas para hacer mi web… Me gustaría hacer un formulario para que la gente se registre pero sin que lo hagan con la interfaz de wordpress sino con un formulario propio pero… Con el código que tu has puesto, cuál es la forma de materializarlo en la página? Es decir, perdona por una pregunta que supongo será tan básica, pero este código lo haces una página php y luego lo enlazas dese la pagina? o funciona desde un post/página del blog? Uhmmm dudas dudas… Supongo que me llevará mucho tiempo enterame de esto..
    Gracias.

    • diumenge, 5 d'abril de 2009 a les 15:49 | #3

      @Ruben si no me equivoco, durante la explicación, indico que para hacer esto asumo que tenéis conocimientos sobre cómo enviar y recibir datos vía GET y POST con PHP. Así mismo creo recordar que puse algún enlace hacia algún manual sobre cómo hacerlo. Mírate dichos manuales, haz alguna prueba por tu cuenta y cuando lo tengas un poco por la mano vuelve aquí y verás como ya no te suena tanto a chino.

      Salud

  3. dissabte, 25 d'abril de 2009 a les 15:37 | #4

    Saludos,
    gracias por la explicacion, muy clara, pero tengo un problema, y es que el role pese a que lo inserta bien en el array del formulario, cuando compruebo el role en el backoffice de wordpres ver. 2.7.1, me muestra el role mas basico de subscriptor. Alguna sugerencia?
    saludos
    Valentin Yonte

  4. Francisco
    dissabte, 25 d'abril de 2009 a les 22:03 | #5

    Hola amigo, tengo un problema con la cuestion que el formulario no confirma si un usuario esta previamente en la base de datos de WP y por ende me los duplica tanto el username como el email, tendras parte del codigo que podria agregarle a este para que me haga esa validacion?

    Saludos

  5. dilluns, 27 d'abril de 2009 a les 13:24 | #6

    Hola @Valentin, acabo de ver en la documentación que el tema de los roles ha cambiado bastante. Echa un vistazo a la página de roles para ver si lo has escogido correctamente.

    Prueba a serializar el rol antes de introducirlo, ya que observo en la base de datos que los datos de la celda “capabilities” (correspondiente a los permisos de usuario) tiene sus datos serializados.

    Si esto no te funciona prueba a utilizar la función update_usermeta tras insertar el usuario para actualizar los datos de la celda “capabilities”.

    Si nada de esto funciona quizás la única opción que te quede es utilizar la función wp_create_user seleccionando el rol que quieres dar a los usuarios por defecto en el panel de control de WordPress.

    @Francisco, puedes utilizar las funciones validate_username, username_exists y email_exists para comprobar si el nombre de usuario es válido, si existe o si el e-mail es válido respectivamente.

    Puede que haya alguna función más de validación que se me pase por alto, echa un vistazo a la página de referencia de funciones por si quieres encontrar alguna más.

    Espero haberos sido de ayuda a ambos :)

  6. dilluns, 27 d'abril de 2009 a les 18:14 | #7

    Gracias por Responder
    Hola Booletaire, he revisado la pagina que me has facilitado, y en principio el role es correcto, ya que aunque ha variado de la 1.5 a la 2.0, el role de contributor queda nombrado de la misma forma. Modifica algo sobre las Capabilities, pero no en si el nombre del Role. no se que puede estarnos pasando. He buscado en Google, pero no encuentro nada claro, y de lo que llego a leer es de hace mas de 2 años…

    —–
    Gracias
    Valentin Yonte

    • dimarts, 28 d'abril de 2009 a les 11:49 | #8

      Lamento no poder ayudarte más @Valentin. Si tuviera tiempo lo intentaba yo mismo, pero justo ahora empiezo con un proyecto que me llevará bastante tiempo.

      De todos modos, insisto, ¿has utilizado la función update_usermeta? No la he utilizado pero creo que debería funcionar. Prueba serializando los datos y no serializándolos a ver si tienes suerte…

      $datos = serialize(array('administrator'));
      update_usermeta($idusuario,'capabilities',$datos);

      Recuerda que la id de usuario te la devuelven las funciones wp_create_user y wp_insert_user una vez creado éste.

      Espero que puedas solucionarlo y confío que si lo logras finalmente me lo hagas saber 😉

      Salu2!

  7. Francisco
    divendres, 1 de maig de 2009 a les 20:24 | #9

    Gracias amigo, estoy un poco limitados en conocimientos técnicos, la primera parte le comprendí porque tu diste los códigos el paso a paso, pero aquí si me bloqueo, gracias de todas formas.

  8. Francisco
    dissabte, 2 de maig de 2009 a les 17:02 | #10

    Hola Booletaire, nuevamente molestando, mira por mas que le intento nada mas no, tengo el mismo problema que Valentin con los roles, también no quiero que ponga el de por default de WP si no uno que yo escoja, y de la misma manera tengo el problema de la duplicación de usuarios en la base de datos, ahora bien se que tienes trabajo y estas ocupado, ya tengo el formulario hecho solo me faltan estos detalles, yo no soy programador y la primera parte que diste pues se me hizo sencillo de interpretar, pero cuando hablas de serializar etc etc no entiendo mucho, te propongo algo, cuanto me cobras por echarme a funcionar bien ese formulario?, se que te puede llevar una o dos horas a lo mejor resolverlo pero a mi me puede llevar días o meses en lo que aprendo jejeje contéstame si gustas a mi correo y nos ponemos de acuerdo, de todas formas ando moviéndome pero si tu me puedes ayudar mejor y claro unos dolares por este favor creo que es justo.

    gracias

    • dimarts, 5 de maig de 2009 a les 11:04 | #11

      Hola Francisco. Lamento no poder ayudarte… cómo he dicho anteriormente estoy muy ocupado, justo ahora empiezo con un trabajo de fin de curso y me llevará algo más de un mes y ya me está ocupando todo mi tiempo.

      Por otro lado, no te cobraría por algo tan sencillo; todo underave ha sido creada por amor al arte y no me parecería correcto. Puede que cuando se me acabe la faena haga un tutorial más específico para hacer un registro de usuarios externo a WordPress, quién sabe.

      Salu2!

  9. Francisco
    diumenge, 10 de maig de 2009 a les 15:40 | #12

    Hola amigo, he buscado a alguien que pueda hacer esto y al parecer nadie dice “yo” :) en fin, si conocieras a alguien que me diera una mano y me sacara del problema te lo agradecería, ya que como dices que te pasaras mucho tiempo ocupado pues no me imagino hasta cuando te podrás desocupar, honestamente si me urge y si tienes algún colega que ayude a este ignorante en programación estaría muy agradecido, nuevamente te reitero la oferta a lo mejor puedas sacar 10 minutos al día durante 12 días y en 2 horas puedas ayudarme jejeje, disculpa la insistencia, no lo tomes a mal, solo quiero solucionar mi necesidad, o tu que estas mas involucrado en este medio un colega o amigo programador que me puedas referir.

    Saludos

  10. Raul Gutirreti
    dimecres, 15 de juliol de 2009 a les 20:06 | #13

    Hola. Parece que falta incluir (Require) algun otro archivo. me tira un error

    call to undefined method stdClass::set_prefix() in wp-settings.php on line 268

    Alguna idea de que esta pasando ? No logro darme cuenta

    Hice el Require de los 2 archivos indicados en tu codigo. Saludos!

  11. dimecres, 15 de juliol de 2009 a les 20:59 | #14

    Hola Raul, estoy bastante seguro de que no falta ningún include, el módulo de registro que hice con ello funciona correctamente a día de hoy.

    El problema puede estar en la versión de WordPress que estás utilizando, es muy nueva? Puede que este post ya haya quedado desactualizado.. y no recuerdo muy bien la versión para la cual lo hice (gran fallo por mi parte no haberlo puesto en el post) pero me parece que era la versión 2.6.

    Espero que me digas la versión que utilizas para así poder plantearme el crear un nuevo artículo actualizado a la última versión :)

    Salu2

  12. dimarts, 28 de juliol de 2009 a les 23:44 | #15

    Booletaire: Muy interesante y util tu post, estoy investigando hace dos semanas como hacer el login / Inicio de session al wordpress de forma externa.. mi itencion es usar los mismo usuarios de la tabla wp_users. pero se me complica por la encriptacion class_phpass.php que usa. sera que podrias darme una manito para utilizart la misma funcion

    Gracias

  13. dimecres, 29 de juliol de 2009 a les 10:02 | #16

    Hola Jorge,

    explícame detalladamente lo que quieres hacer. ¿Cuándo exactamente vas a utilizar la classe de encriptación? ¿Estás utilizando las funciones propias de WordPress o te has descargado la classe phpass y pruebas directamente con ella?

    Salud

  14. dimecres, 29 de juliol de 2009 a les 12:40 | #17

    Antes nada muchas gracias por responder, bueno. lo que quiero hacer es utlizar un formulario de login completamente externo al wordpress, actualmente la unica relacion que tiene mi formulario con el wordpress es que se conecta a su tabla de usuarios wp_users.

    El problema existe cuando realizo el select consultando usuario y contrasenia, la contrasenia encriptada del wordpress nunca se me iguala a la contrasenia que genero con la misma clase “class_phpass.php” por decirte asi la contrasenia es “1234” el wordpress con su funcion crea

    $P$f37hd73d7h73hhd73774488488438mms

    y yo con mi formulario utilizando la misma clase que usa y generando el mismo valor “1234” me genera distinto

    $P$hhfhhd73h7hr737y33323mrmjd833e33

    y ahi me encuetro con el problema de valicacion las contrasenias son las mismas pero el hash no.

    lo que te consultaba anteriormente es si existe la posibilidad de usar alguna clase de wordpress para realizar el login asi como tu tutorial
    Saludos

  15. Booletaire
    dimecres, 29 de juliol de 2009 a les 15:22 | #18

    Sí que existe. Si sabes inglés puedes ir a esta página:

    http://www.cubehouse.org/2008/12/external-login-using-the-wordpress-27-login-system/

    Pero por si te interesa continuar con tu intento.. ¿Con qué valores has iniciado la clase phpass?

    Si te has mirado la documentación de wordpress sabrás que hay que iniciarla con ciertos valores (y si no lo sabías te lo acabo de contar ;)). El “iteration_count” debe estar a 8 y “portable_hashes” debe estar activado (true).

    Espero que con esto tengas suficiente. Si tienes cualquier otra duda ya sabes ^^

  16. Rafael
    divendres, 23 d'abril de 2010 a les 20:56 | #19

    Raul Gutirreti :
    Hola. Parece que falta incluir (Require) algun otro archivo. me
    tira un error
    call to undefined method stdClass::set_prefix() in wp-settings.php on
    line 268
    Alguna idea de que esta pasando ? No logro darme cuenta
    Hice el Require de los 2 archivos indicados en tu codigo. Saludos!

    Saludos Booletaire:

    Muy interasante tu explicacion. Sabes, tengo un problema similar al que que te planteaba Raul y parece que efectivamente es un asunto de versiones. En mi caso estoy tratando de comunicar con WordPressMu 2.9.2. Tengo exactamente el mismo error pero en esta ocasion en la linea 286 “Fatal error: Call to undefined method stdClass::set_prefix() in C:\xampp\htdocs\blogs\wp-settings.php on line 286”.

    Les agradezco cualquier ayuda que me puedan brindar, no se si ya raul logro sulucionarlo.

    Gracias,
    Rafael.

  17. julio
    diumenge, 1 d'abril de 2012 a les 00:38 | #20

    gracias

Comentaris tancats.