Используем PHP-сессии в Wordpress

Открываем PHP-сессию

Сегодня я хочу рассказать, как использовать сессии PHP в WordPress. В стандартном PHP-приложении сессия начинается после вызова функции session_start, запущенной в начале PHP-скрипта. Вам нужно открыть файл header.php используемой темы и добавить туда следующий код:

<?php session_start(); ?>
<!DOCTYPE html>
<head> ....

Но этот метод сложно назвать самым эффективным. WordPress предлагает API Actions, к которому можно привязывать собственные функции. В приведенном далее примере используется как раз этот метод. Добавьте следующий код в самое начало файла functions.php.

  1. Мы воспользуемся событием init, с помощью которого можно запустить PHP-сессию. При первой инициализации WordPress мы добавляем действие, которое вызывает функцию:
add_action('init', 'start_session', 1);
  1. Далее создаем функцию start_session. Обратите внимание, что функция сначала проверяет, активна ли сессия, и только потом запускает новую сессию при помощи функции session_id:
function start_session() {
if(!session_id()) {
session_start();
}
}

Закрываем PHP-сессию

Функция session_destroy позволяет очистить сессию PHP. Но когда именно вызывать эту функцию? Многое зависит от самого приложения. WordPress также предлагает несколько способов реализовать это при помощи API Actions.

  1. В WordPress может потребоваться очистить сессию при выходе пользователя из системы, либо при авторизации нового пользователя на сайте. Для вызова функции end_session(), которую мы создадим позже, будут использоваться хуки wp_logout и wp_login:
add_action(‘wp_logout’, ‘end_session’);
add_action(‘wp_login’, ‘end_session’);
  1. Далее создаем функцию end_session:
function end_session() {
session_destroy ();
}

Принудительное закрытие сессии

Можно использовать собственный хук, чтобы с помощью PHP закрыть сессию в любом фрагменте шаблона. Мы воспользуемся do_action для вызова функции end_session, которую мы создали выше.

  1. В файл functions.php нужно добавить следующий код:
add_action('end_session_action', 'end_session');

Если вы все сделали правильно, то самый верх вашего файла functions.php будет выглядеть следующим образом:

add_action('init', 'start_session', 1);

function start_session() {
if(!session_id()) {
session_start();
}

add_action(‘wp_logout’, ‘end_session’);
add_action(‘wp_login’, ‘end_session’);
add_action(‘end_session_action’, ‘end_session’);

function end_session() {
session_destroy ();
}

Теперь нужно добавить глобальную переменную $_SESSION, которой можно воспользоваться в любой момент при работе с приложением. Переменная является массивом, и ниже приведен пример добавления данных в массив сессии:

$foo = ‘Foo Data’;
$_SESSION[‘foo’] = $foo;

Что нужно учесть:

Если вы занимаетесь разработкой масштабируемого сайта, то возможно вам и не придется использовать эти сессии. HTTP – это протокол без запоминания состояний, сессии PHP основываются на состояниях. Сессии хранятся на сервере и обрабатываются им же. Маршрутизация каждой сессии до нужного сервера требует более сложной конфигурации, и создает проблемы для пользователей, чьи сессии хранятся на этом сервере.

По возможности, информацию о сессиях лучше хранить в браузере. Это позволит сэкономить ресурсы сервера, а также избавиться от ненужного функционала.

Спасибо, что были с нами! Надеюсь, вам пригодится эта статья, и если у вас возникли вопросы, обязательно задайте их в комментариях!

Дайте знать, что вы думаете по этой теме материала в комментариях. За комментарии, отклики, подписки, дизлайки, лайки низкий вам поклон!

Пожалуйста, опубликуйте свои отзывы по текущей теме статьи. За комментарии, лайки, дизлайки, подписки, отклики огромное вам спасибо!

Валентин Сейидовавтор-переводчик статьи «Using PHP Sessions in WordPress»

Подписывайтесь на наши группы в социальных сетях
Подписаться
Уведомить о
6 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Александр Трушкин

Вообще при работе в вп с сессиями заметил что самым эффективным будет стартовать сессию не через add_action('init'), а именно просто напросто прописать session_start в файле конфига, и лучше до define( 'WP_DEBUG').

Почему так лучше??? Да потому что не видит переменную $_SESSION в плагине или в файле функций, к примеру при загрузке страницы мне сразу нужно определить есть ли сессия у юсера или нет, и если она есть то сразу получить данные по юсеру. В общем подключение сессии через add_action('init') как то совсем криво работает, поскольку событие init срабатывает после подключения плагинов и файлов функций темы. Если все таки хотите подключить через акшен, то лучше использовать событие plugins_loaded и тогда будет вот так add_action('plugins_loaded', 'ваша функция', 1);

Александр Трушкин

Все что написано в блоке "Что нужно учесть" считаю в корне не верным. Сессии не жрут ресурсы. Хранить инфу по юсеру у него в браузере не есть гуд, потому что украсть его куки могут, с сессиями так не прокатит, кому кому а вот сессиям доверять можно в отличие от кукисов и все что приходит от пользователя.

Вадим Куликов

А в какой файл добавлять глобальную переменную&nbsp;$_SESSION, и в какой участок кода?

Алексей Дружаев
7 месяцев назад
Ответить на  Вадим Куликов

Обычно код добавляется в конец файла function.php в активной теме.

Александр Трушкин
6 месяцев назад
Ответить на  Вадим Куликов

Да не, просто добавлять эту переменную, а с ней нужно работать, если у вас включена сессия session_start

Вася

Но этот метод сложно назвать самым эффективным. WordPress предлагает API Actions.