Как хранить и получать переменные в сессиях WordPress?
У меня есть форма с чекбоксами, полями ввода и селектами, которая показывает то, что хочет пользователь через AJAX-запрос. Проблема в том, что когда пользователь кликает на элемент и открывается страница с деталями, а затем решает вернуться на предыдущую страницу, ему нужно снова кликать и выбирать свой предыдущий выбор.
Я хотел бы сделать так, чтобы WordPress сохранял все опции в сессии, когда нажимается кнопка перехода на страницу с деталями, и сохранял актуальную информацию в сессии, а затем, когда пользователь снова посещает страницу, значения проверялись бы в сессии и устанавливались, если они там есть.
Возможно ли это сделать в WordPress?
Если да, то как?
Давайте упростим и скажем, что у нас есть что-то вроде этого в нашей форме:
<input class="car_color" type="checkbox" name="car_color" value="1" />
<input class="car_color" type="checkbox" name="car_color" value="2" />
<input class="car_color" type="checkbox" name="car_color" value="8" />
<input class="car_color" type="checkbox" name="car_color" value="4" />
<input class="car_color" type="checkbox" name="car_color" value="6" />
Я не использую кнопку отправки в моей форме, она обрабатывается через AJAX при изменении input.
А в моих результатах, получаемых через ajax, есть ссылка на страницу с деталями:
<a class="detail-info-link" href="<?php echo $url ?>">
Есть ли идеи, как я могу сохранить мои значения в сессии и вызвать их при повторном посещении/перезагрузке/нажатии кнопки назад в браузере?
Мне нужно иметь возможность читать сохраненные в сессии данные и использовать их через JavaScript и запускать мою функцию поиска через ajax, которая уже хорошо работает.
Мне просто нужно сохранить (вероятно, перед переходом по $link в href кнопки деталей) и читать переменные сессии (если они существуют).
По умолчанию в WordPress сессии не включены. Если вам нужно активировать PHP-сессии, добавьте следующий код в начало файла functions.php
:
if (!session_id()) {
session_start();
}
Теперь вы можете использовать $_SESSION['ваша-переменная'] = 'ваше-значение';
для установки переменной сессии. Ознакомьтесь с документацией PHP по сессиям.
Обновление:
Был второй ответ, который, на мой взгляд, также имел ценность — к сожалению, он был удалён, и я добавляю информацию здесь. В ответе упоминался плагин WP Session Manager, созданный @eamann, как альтернативное решение.
Я читал о нём, но сам не использовал, так как пока использую PHP-сессии — у меня не возникало проблем с их применением. Вот комментарий автора плагина о возможных преимуществах этого решения.

Возможно, в WordPress нет привычных сессий... тем не менее, WordPress работает с концепцией пользователей. Вы можете управлять информацией, связанной с конкретными пользователями, используя функции add_user_meta
, update_user_meta
, get_user_meta
и delete_user_meta
.
Если вам нужен доступ к этой информации в JavaScript, вы можете написать небольшой PHP-скрипт, который выводит необходимые данные, и вызывать его через Ajax.

Я объясню, как установить сессию с именем пользователя с помощью плагина Native PHP Sessions for WordPress. Вы можете применить эту логику к своей проблеме.
Добавьте это в файл functions.php
if (!session_id()) {
session_start();
}
if ( isset( $_POST['wp-submit'] ) ){
$_SESSION['username']=$_POST['log'];
}
$_POST['log'] ссылается на поле ввода имени пользователя в форме входа WordPress. Когда пользователь входит в систему, имя пользователя сохраняется в $_SESSION['username']. В вашем случае вы бы заменили 'log' на имена переменных формы, которые у вас есть, например 'car_color'.
Позже вы можете обратиться к имени пользователя в другом PHP-файле следующим образом:
$username=$_SESSION['username'];

Сначала вам нужно начать сессию в WordPress, но вы не можете сделать это просто так.
Перед началом сессии необходимо проверить, не была ли сессия уже запущена каким-либо плагином, чтобы избежать неожиданных проблем. Для этого потребуется небольшой алгоритм.
if (version_compare(PHP_VERSION, '7.0.0', '>=')) {
if(function_exists('session_status') && session_status() == PHP_SESSION_NONE) {
session_start(apply_filters( 'cf_geoplugin_php7_session_options', array(
'cache_limiter' => 'private_no_expire',
'read_and_close' => false
)));
}
}
else if (version_compare(PHP_VERSION, '5.4.0', '>=') && version_compare(PHP_VERSION, '7.0.0', '<'))
{
if (function_exists('session_status') && session_status() == PHP_SESSION_NONE) {
session_cache_limiter('private_no_expire');
session_start();
}
}
else
{
if(session_id() == '') {
if(version_compare(PHP_VERSION, '4.0.0', '>=')){
session_cache_limiter('private_no_expire');
}
session_start();
}
}
Я также добавил поддержку старых версий PHP.

На странице PHP, которая получает AJAX-запрос, установите $_SESSION следующим образом.
$car_color = <данные, выбранные пользователем в форме>;
$_SESSION['car_color'] = $car_color;
Доступ к переменной $_SESSION
if(isset($_SESSION['car_color'])) {
$value = $_SESSION['car_color'];
} else {
$value = 'Пожалуйста, выберите цвет автомобиля.';
}
Это руководство более подробно рассказывает о правильной настройке и завершении сессий.
