Сессия потеряна после подачи формы в wordpress

Сессия, которую я установил, теряется после отправки формы.

Я построил класс сеанса для установки нового сеанса, отмены и т.д. В function.php шаблона wordpress.

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

Я пытаюсь установить сеанс как:

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

После отправки формы он переместится на ссылку (212). Затем я попробовал.

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

Ответ 1

Вам нужно переместить сеанс start/resume в свой конструктор сеанса.

Так же:

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

Еще одно замечание: каждый раз, когда вы будете делать new Session, вы получите объект с одинаковой функциональностью, работающий с одной и той же глобальной переменной $_SESSION.

Вам не нужно больше одного объекта $session, было бы неплохо изучить Singleton pattern.

Ответ 2

Вы должны всегда вызывать session_start() для каждого запроса.

Миссия session_start():

  • Создает новый сеанс
  • Перезапустить существующий сеанс

Это означает, что если вы создали сеанс и вы не вызываете метод session_start(), переменная $_SESSION не будет выполнена.

За исключением: Если в вашем php.ini вы установили опцию session.auto_start в 1, в этом случае не нужно вызывать session_start(), потому что переменная $_SESSION выполняется неявно.

Ответ 3

Вам нужно использовать глобальную переменную wordpress для условия установки сеанса или нет:

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

Ответ 4

Мне кажется, что session_start() не задано в начале страницы, на которую ссылается get_permalink(212;).

У меня почти нет опыта работы с самим WP, поэтому я мог бы неправильно понять функциональность get_permalink()

Ответ 5

Возможно, это связано с www. в начале вашего сайта. Убедитесь, что обе страницы используют одну и ту же структуру.

Также я столкнулся с той же проблемой давным-давно, когда форма отправляет данные на защищенный адрес (https://)

Я надеюсь, что эти два элемента могут вам помочь.

Ответ 6

Я согласен с ответом от @rock3t, чтобы инициализировать сеанс в конструкторе класса, но каждый раз, когда объект класса инициируется, он будет проверять сеанс!

Вместо этого, если вы в порядке, самый простой способ получить доступ к сеансу - это добавить следующие строки в файл wp-config.php перед вызовом wp-settings

if (!session_id())
    session_start();

Это установит/инициализирует сеанс глобально, и вам не нужно будет устанавливать/проверять session_start в конструкторе класса.

Спасибо.

Ответ 7

Вы можете проверить, устанавливается ли сеанс в первую очередь... каково содержимое вашей формы?... также ваш php script не имеет session_start().. является function.php включен в ваш PHP скрипт