wp_signon() no autentica al usuario, se necesita orientación

24 sept 2013, 20:40:45
Vistas: 25.3K
Votos: 7

Uso un formulario para enviar una solicitud POST a una página y para iniciar sesión del usuario con wp_signon() para autenticar al usuario en mi instalación de WordPress como se describe en la documentación de WP:

$creds = array();
$creds['user_login'] = $_POST["user-login"];
$creds['user_password'] = $_POST["user-password"];
$creds['remember'] = true;

$user = wp_signon( $creds, false );

Después de este pequeño fragmento de código, verifico si el usuario ha iniciado sesión:

if ( is_user_logged_in() ) { echo "SUCCESS"; } else { echo "FAIL!"; }

Pero obtengo FAIL! todo el tiempo. Luego, después de investigar un poco, encontré este pequeño truco:

wp_set_current_user( $user );
if ( is_user_logged_in() ) { echo "SUCCESS"; } else { echo "FAIL!"; }

Obtuve SUCCESS en este caso, pero cuando salgo de esta página obtengo FAIL una y otra vez.

¿Alguien puede explicarme cómo iniciar sesión del usuario con wp_signon() sin cerrar su sesión después de que la página cambie o se recargue o lo que sea?


Obtuve el resultado deseado cuando voy a /wp_admin e inicio sesión con el formulario predeterminado de WP. Puedo navegar por todas las páginas de mi sitio WP permaneciendo conectado todo el tiempo. Pero cuando intento hacer esto fuera del formulario predeterminado, obtengo FAIL.

¡Guíenme! ¡POR FAVOR!

11
Comentarios

¿tu sitio tiene SSL, es decir, el esquema de URL de tu sitio es http o https??

Anjum Anjum
24 sept 2013 21:26:34

@Anjum en realidad lo guardo en mi localhost con MAMP... así que mi respuesta es No lo sé ))

LoomyBear LoomyBear
24 sept 2013 21:44:18

¿puedes decirme cómo accedes a tu página de inicio de sesión? me refiero a la URL de tu página de inicio de sesión, http://localhost/login-page/ o https://localhost/login-page/ ?

Anjum Anjum
24 sept 2013 21:47:33

por favor publica aquí el código de tu formulario de acceso personalizado, así que...

Anjum Anjum
24 sept 2013 21:49:18

@Anjum Yo solo uso http://localhost:8888/registration/ pero si intentas sugerir wp_signon( $user, secure:true/false ) ya probé ambos y no funcionó. De todas formas gracias.

LoomyBear LoomyBear
24 sept 2013 21:54:14

publica aquí el código de tu página de registro para que pueda resolver tu problema

Anjum Anjum
24 sept 2013 22:01:15

@Anjum Aquí está en pastebin

LoomyBear LoomyBear
24 sept 2013 22:17:56

código html del formulario no encontrado en tu código

Anjum Anjum
24 sept 2013 22:25:36

@Anjum disculpa por esto... he actualizado el pastebin por favor revisa

LoomyBear LoomyBear
24 sept 2013 22:31:12

no tienes un campo de inicio de sesión de usuario en tu formulario, agrega un input de texto con el nombre user-login y también usa <?php the_permalink(); ?> en el atributo action del formulario en lugar de <? echo get_permalink( get_page_by_path('registration') ); ?>

Anjum Anjum
24 sept 2013 22:35:02

@Anjum como puedes ver en el pastebin $user_login y $user_email son lo mismo $_POST["user_email"] y con respecto al action del formulario, es simplemente el enlace permanente a la misma página, así que se procesa a sí misma.

LoomyBear LoomyBear
24 sept 2013 22:38:23
Mostrar los 6 comentarios restantes
Todas las respuestas a la pregunta 2
7

Finalmente esto funciona para mí en mi instalación local de WordPress después de reemplazar los guiones - con guiones bajos _ en el atributo name del input y usando las etiquetas PHP completas <?php en lugar de <?. El código final está aquí, copia y pégalo en tu plantilla.

<?php if ( isset($_POST["user_email"]) && isset($_POST["user_password"]) ) {

$user_login     = esc_attr($_POST["user_email"]);
$user_password  = esc_attr($_POST["user_password"]);
$user_email     = esc_attr($_POST["user_email"]);

$user_data = array(
    'user_login'    =>      $user_login,
    'user_pass'     =>      $user_password,
    'user_email'    =>      $user_email,
    'role'          =>      'student' // Rol del usuario
);

// Insertando nuevo usuario en la base de datos
//wp_insert_user( $user_data );

$creds = array();
$creds['user_login'] = $user_login;
$creds['user_password'] = $user_password;
$creds['remember'] = true; // Recordar usuario

$user = wp_signon( $creds, false );

$userID = $user->ID;

wp_set_current_user( $userID, $user_login );
wp_set_auth_cookie( $userID, true, false );
do_action( 'wp_login', $user_login );

}

if ( is_user_logged_in() ) : echo 'ÉXITO'; ?>
<h1>HTML para usuario conectado </h1>
<?php else : echo 'FALLÓ!'; ?>
<form id="user-credentials" method="post" action="<?php the_permalink(); ?>">
    <p><input name="user_email" type="text" placeholder="Correo electrónico" /></p>
    <p><input name="user_password" type="password" placeholder="Contraseña" /></p>
    <p><input type="submit" class="button blue size-s" value="Enviar" /></p>
</form>
<?php endif; ?>
24 sept 2013 22:52:33
Comentarios

¿Mantiene la sesión iniciada cuando vas a una página diferente a la que contiene el formulario? ¿donde se establece wp_set_current_user();?

LoomyBear LoomyBear
24 sept 2013 23:01:13

sí, funciona bien para mí, revisa la configuración de cookies de tu navegador

Anjum Anjum
24 sept 2013 23:32:37

He verificado las cookies en todos los navegadores. Están habilitadas en todos. Cuando uso este código, inicia sesión solo cuando el formulario envía una solicitud POST. Cuando la página se recarga sin enviar nada, nadie permanece conectado. Probé global $current_user; var_dump($current_user); y obtuve información del usuario solo cuando se envió el POST, de lo contrario devuelve object(WP_User)#206 (7) { ["data"]=> NULL ["ID"]=> int(0) ...

LoomyBear LoomyBear
24 sept 2013 23:48:09

también cuando inicio sesión a través del formulario de inicio de sesión predeterminado de WP con el mismo usuario, obtengo $current_user volcado correctamente en ambos casos. ¿Qué me pasa??!!

LoomyBear LoomyBear
24 sept 2013 23:49:58

¿estás llamando tanto a wp_insert_user() como a wp_signon() en cada solicitud? si es así, intenta comentar wp_insert_user() y luego inicia sesión para ver el resultado.

Anjum Anjum
25 sept 2013 00:03:36

he colocado los archivos de plantilla en el servidor remoto y funciona. Lo siento por molestarte tanto tiempo... fue mi error todo el tiempo. Parece que wp_signon(); funciona como se esperaba

LoomyBear LoomyBear
25 sept 2013 00:05:31

Creo que el problema está en tu instalación de WordPress, intenta reinstalarlo en tu servidor local.

Anjum Anjum
25 sept 2013 00:17:29
Mostrar los 2 comentarios restantes
0

Si tu contraseña incluye los caracteres # y/o @, necesitas codificarla en URL antes de enviarla en el formulario, y luego decodificarla antes de establecer las credenciales en wp_signon.

La codificación URL para @ es %40, # es %23 y ! es %21

Si tu contraseña es mY!p@ssWord# entonces debe ser codificada en URL antes de enviarla como mY%21p%40ssWord%23, y luego decodificada antes de establecer las credenciales para wp_signon

20 jun 2019 08:12:47