WordPress no utiliza variables de sesión PHP (la superglobal $_SESSION). Aunque puedas no estar de acuerdo, esto es, en pricipio, muy buena idea. Pero desafortunadamente hay veces que uno necesita echar mano de estas variables para guardar información entre una solicitud y otra y puede verse un poco frustrado si está trabajando con WordPress.

Hay ya muchos tutoriales en internet sobre este tema y muchas discusiones sobre cuál es el mejor método. Así que no me voy a andar por las ramas. Si quieres que todo vaya bien tienes que crear las variables de sesión en el action hook init:

add_action('init', 'cyb_session_start', 1);
function cyb_session_start() {
    if( ! session_id() ) {
        session_start();
    }
}

Nota que hemos pasado la prioridad 1 a la función add_action, pues tiene que ejecutarse antes que cualquier otra parte de la aplicación que necesite acceder a las variables de sesión. Si registras la sesión en PHP antes del evento init puede que sea destruída por wp_unregister_GLOBALS().

Terminar la sesión si el usuario hace log in/log out

Si utilizamos el código anterior sin más, la sesión de PHP seguirá siendo la misma y las variables de sesión seguirán almacenando la misma información si un usuario inicia sesión o cierra sesión en WordPress (no confundir el log in o el inicio de sesión en WordPress con las variables de sesión PHP). Para evitar posibles errores, por ejemplo cuándo un usuario hace log in en un cuenta, luego log out y luego otra vez log in pero en una cuenta diferente, las variables de sesión deberían destruirse cuándo el usuario inicia/cierra sesión en WordPress:

add_action( 'init', 'cyb_session_start', 1 );
add_action( 'wp_logout', 'cyb_session_end' );
add_action( 'wp_login', 'cyb_session_end' );

function cyb_session_start() {
    if( ! session_id() ) {
        session_start();
    }
}

function cyb_session_end() {
    session_destroy();
}

Ahora las variables de sesión son tuyas, haz con ellas lo que quieras. Y disfruta 😉

  • Gabriel

    Hola,

    Si no utiliza sesiones como mantiene el estado durante el tiempo en el que está el usuario?

    Saludos, excelente artículo

    • Sencillamente no lo hace. No mantiene el estado del usuario. Es una plataforma stateless. Para los casos en que es necesario “recordar” al usuario, WordPress utiliza cookies. Por ejemplo para usuarios no logeados que han dejado un comentario y para usuarios logeados