Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Session lost after form submit in wordpress

The session I set is lost after the form is submitted.

I had built the session class to set new session, unset and so on. In function.php of wordpress template.

function.php

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

Session.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]);
        }
    }
}

I try to set session as :

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

After submit the form it goes to the permalink(212). Then I tried.

<?php
    $sess = new session();
    $value = $sess->userdata('sess_name');
    var_dump($value);      //returns false. That means session is lost after form submit. Why?
?>
like image 228
user254153 Avatar asked Apr 03 '17 04:04

user254153


3 Answers

You need to move session start/resume into your Session's constructor.

Like so:

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

Another thing to mention, every time you'll do new Session you'll be getting an object of the same functionality working with same global variable $_SESSION.

You don't need more than one $session object, it would be a good time to look into Singleton pattern.

like image 85
rock3t Avatar answered Oct 14 '22 05:10

rock3t


You have to call always session_start() for each request.

The mission of session_start() is:

  • Creates a new session
  • Restart an existing session

That means, if you have created a session, and you don't call to the method session_start(), the variable $_SESSION is not going to be fulfilled.

Except: If in your php.ini you have set the option session.auto_start to 1, then, in that case it is not needed to call the session_start() because the variable $_SESSION is fulfilled implicitly.

like image 42
Miguel Avatar answered Oct 14 '22 05:10

Miguel


You need to use wordpress global variable for condition that session is set or not something like :

global $session;
if (!session_id()) {
    session_start();
}
include get_template_directory() . "/custom/session.php";
like image 3
Mohsin khan Avatar answered Oct 14 '22 07:10

Mohsin khan