Sesión perdida después de enviar formulario en wordpress

4 minutos de lectura

avatar de usuario
usuario254153

La sesión que configuré se pierde después de enviar el formulario.

Había creado la clase de sesión para configurar una nueva sesión, desactivarla, etc. En function.php de la plantilla de wordpress.

función.php

if (!session_id()) {
    session_start();
}
include get_template_directory() . "/custom/session.php";

Sesión.php

class session {
    function __construct() {

    }

    function set_flashdata($name, $value) {
        $_SESSION[$name] = $value;
    }

    function flashdata($name) {
        if (isset($_SESSION[$name])) {
            $str = $_SESSION[$name];
            return $str;
        } else {
            return FALSE;
        }
    }

    function userdata($name) {
        if (isset($_SESSION[$name])) {
            return $_SESSION[$name];
        } else {
            return FALSE;
        }
    }

    function set_userdata($name, $value) {
        $_SESSION[$name] = $value;
    }

    function unset_userdata($name) {
        if (isset($_SESSION[$name])) {
            unset($_SESSION[$name]);
        }
    }
}

Intento configurar la sesión como:

<?php 
    $sess = new session();
    $sess->set_userdata('sess_name',"some value");
?>
<form action="get_permalink(212);">
    //input buttons
</form>

Después de enviar el formulario, va al enlace permanente (212). Entonces lo intenté.

<?php
    $sess = new session();
    $value = $sess->userdata('sess_name');
    var_dump($value);      //returns false. That means session is lost after form submit. Why?
?>

Debe mover el inicio/reanudación de la sesión al constructor de su sesión.

Al igual que:

class session
{
    function __construct()
    {
        if (! session_id()) {
            session_start();
        }
    }

Otra cosa a mencionar, cada vez que hagas new Session obtendrá un objeto de la misma funcionalidad trabajando con la misma variable global $_SESSION.

No necesitas más de uno $session objeto, sería un buen momento para investigar Singleton pattern.

  • Después de referirme al patrón singleton y cambiar el patrón de diseño a singleton para mi clase de sesión. Mis problemas se resolvieron. Pero cómo resolvió mi error. No estoy recibiendo. ¿Se debe a un solo objeto de la clase?

    – usuario254153

    12 de abril de 2017 a las 9:37

  • Hola @user254153 (sería bueno llamarte por tu nombre). El problema siempre se debía a que no se iniciaba/reanudó la misma sesión. El algoritmo de corrección fue para asegurarse de que está iniciando/reanudando una sesión cada vez que consulta el objeto de la sesión, de ahí el ejemplo que di para mover el inicio/reanudar de la sesión a __constructor. El patrón Singleton funciona muy bien aquí, ya que desea tener un acceso global al objeto Sesión y no crear más de una instancia.

    – rock3t

    12 de abril de 2017 a las 10:12

  • Exactamente. Después de singleton, no tuve que crear un nuevo objeto cada vez que llamé a la sesión.

    – usuario254153

    12/04/2017 a las 19:42

Tienes que llamar siempre session_start() para cada solicitud.

La misión de session_start() es:

  • Crea una nueva sesión
  • Reiniciar una sesión existente

Eso significa que, si ha creado una sesión y no llama al método session_start(), la variable $_SESSION no se cumplirá.

Excepto: Si en tu php.ini ha configurado la opción session.auto_start a 1, entonces, en ese caso no es necesario llamar a session_start() porque la variable $_SESSION se cumple implícitamente.

Debe usar la variable global de wordpress para la condición de que la sesión esté configurada o no, algo así como:

global $session;
if (!session_id()) {
    session_start();
}
include get_template_directory() . "/custom/session.php";

  • ¿Por qué usar $ session.

    – usuario254153

    3 de abril de 2017 a las 5:03

  • wordpress tiene muchas variables globales, por lo que puede usar cualquier lugar en el código wp.

    – Mohsin khan

    3 de abril de 2017 a las 5:22

  • Sigue siendo el mismo problema para la variable wp_session

    – usuario254153

    3 de abril de 2017 a las 5:42

  • Necesita usar session_start() en session.php dentro del constructor algo como esta función __construct() { session_start(); }

    – Mohsin khan

    3 de abril de 2017 a las 5:46


Puede ser debido a www. al comienzo del dominio de su sitio web. Asegúrese de que ambas páginas utilicen la misma estructura.

También enfrenté el mismo problema hace mucho tiempo cuando el formulario envía los datos a una dirección segura (https://)

Espero que estos dos artículos te puedan ayudar.

avatar de usuario
G4Hu

me suena a session_start() no está establecido al comienzo de la página que get_permalink(212;) se refiere a.

Sin embargo, casi no tengo experiencia con WP en sí, por lo que podría malinterpretar la funcionalidad de get_permalink()

avatar de usuario
Udit Trivedi

Estoy de acuerdo con la respuesta de @rock3t para inicializar la sesión en el constructor de la clase, pero cada vez que se inicia un objeto de clase, ¡buscará la sesión!

En cambio, si está bien, la forma más sencilla de obtener acceso a la sesión es agregando las siguientes líneas a su wp-config.php archivo antes de la llamada a configuración de wp

if (!session_id())
    session_start();

Esto configurará/inicializará la sesión globalmente y no necesitará configurar/comprobar session_start en el constructor de una clase.

Gracias.

¿Ha sido útil esta solución?