Crear formulario de registro de usuarios en WordPress
Tengo una página con un formulario llamada Test Form con este formulario:
<div id="container">
<form action="wp-content/themes/max-magazine/TestForm.php" method="post" name="myForm">
Usuario <input type="text" name="uname" />
Email <input id="email" type="text" name="uemail" />
Contraseña <input type="password" name="upass" />
<input type="submit" value="Enviar" /></form>
</div>
Y en el backend tengo un archivo php llamado TestForm.php
<?php
function crear_cuenta(){
$usuario = 'IDdeCuenta';
$contraseña = 'ContraseñaDeCuenta';
$email = 'email@dominio.com';
if ( !username_exists( $usuario ) && !email_exists( $email ) ) {
$id_usuario = wp_create_user( $usuario, $contraseña, $email );
$usuario = new WP_User( $id_usuario );
$usuario->set_role( 'contributor' );
}
}
add_action('init','crear_cuenta');
?>
Si esta función está definida en functions.php funciona correctamente y crea el usuario, pero la misma función en TestForm.php no funciona. Por favor ayuda.
También obtendré los datos del formulario así:
<?php
$usuario = $_POST['uname'];
$contraseña = $_POST['upass'];
$email = $_POST['uemail'];
?>

Estás enviando los datos del formulario directamente al archivo TestForm.php
, que es un script PHP fuera de la lógica de WordPress. Es un script independiente. Podrías establecer el atributo action
del formulario como una cadena vacía, de esta manera los datos del formulario se envían a la misma página que contiene el formulario, que es parte de WordPress:
<div id="container">
<form method="post" name="myForm">
Usuario <input type="text" name="uname" />
Correo <input id="email" type="text" name="uemail" />
Contraseña <input type="password" name="upass" />
<input type="submit" value="Enviar" />
</form>
</div>
En este caso, los datos del formulario se envían a una página de WordPress y se activa el add_action('init','create_account');
si lo agregas al archivo functions.php
, por ejemplo así:
add_action('init','create_account');
function create_account(){
//Puedes necesitar validación de datos aquí
$user = ( isset($_POST['uname']) ? $_POST['uname'] : '' );
$pass = ( isset($_POST['upass']) ? $_POST['upass'] : '' );
$email = ( isset($_POST['uemail']) ? $_POST['uemail'] : '' );
if ( !username_exists( $user ) && !email_exists( $email ) ) {
$user_id = wp_create_user( $user, $pass, $email );
if( !is_wp_error($user_id) ) {
//usuario creado
$user = new WP_User( $user_id );
$user->set_role( 'contributor' );
//Redirección
wp_redirect( 'URL_donde_quieres_redirigir' );
exit;
} else {
//$user_id es un objeto WP_Error. Maneja el error
}
}
}
P.D.: Te sugiero que uses un marcado de formulario HTML5 moderno y tipos de input actualizados

Entonces el problema es cómo obtener los valores de usuario, email y contraseña en functions.php desde el formulario myForm?

Tienes acceso a $_POST
dentro de la función create_account()
, así que obtienes los valores como lo harías con cualquier otro formulario en PHP. Y puedes crear TestForm.php
pero tendrás que cargar el motor de Wordpress en ese archivo, lo cual realmente creo que no quieres hacer.

¿Y dónde estoy definiendo esta función? ¿Está en functions.php? ¿O en TestForm.php?

¿Entonces quieres decir que debo hacerlo en functions.php? ¿Entonces cómo sabrá el formulario a qué archivo PHP necesita responder? ¿Y qué pasa si necesito redirigirlo a otra página cuando el registro sea exitoso?

Usa wp_redirect
. Creo que estás confundiendo la URL con la ubicación del script PHP.

Coloca wp_redirect
donde quieras que se ejecute, obviamente. Por ejemplo, si quieres que se ejecute después de un wp_create_user
exitoso, ponlo después de verificar que wp_create_user
haya creado un usuario correctamente. Mira la respuesta editada. Creo que tu pregunta sobre "Crear un formulario de registro de usuario en WordPress" ya está respondida, preguntas más específicas deberían hacerse en nuevas preguntas, por ejemplo, ¿cómo usar wp_redirect?
Si no, podemos tener una discusión interminable aquí.
