wp_signon() no autentica al usuario, se necesita orientación
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!

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; ?>

¿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();
?

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

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) ...

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??!!

¿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.

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

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
