Сессия потеряна после подачи формы в 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 скрипт