Как правильно подключить session_start() при создании плагина WordPress?

24 авг. 2016 г., 22:03:13
Просмотры: 13.7K
Голосов: 5

Изучая работу с сессиями, я выяснил, что session_start() должен идти сразу после <?php, согласно Где именно размещать SESSION_START?. Я хотел создать плагин, который добавлял бы session_start() в header.php после открывающего тега <?php, но после поиска я не смог точно определить правильный способ сделать это.

Я искал информацию по сессиям, но в разных вопросах и ответах встречаются разные подходы, в основном используют:

Итак, при создании плагина, который использует сессии и должен добавлять их в header.php, какой хук наиболее подходит для добавления session_start()?

4
Комментарии

Просто пища для размышлений о сессиях. Некоторые говорят, что стоит добавить это в конфиг.

Howdy_McGee Howdy_McGee
24 авг. 2016 г. 22:10:13

Правда? Никогда об этом не слышал. Разве это нормально, когда плагин изменяет конфиг? Это может привести к другому вопросу после поиска.

user9447 user9447
24 авг. 2016 г. 22:11:38

На самом деле, сессию следует запускать только если она еще не запущена. if ( !session_id() ) { session_start(); } Так что не думаю, что это критично важно, но определенно стоит проверять перед использованием $_SESSION. Но мне любопытно, есть ли у кого-то лучше объяснение.

bynicolas bynicolas
24 авг. 2016 г. 22:28:43

@bynicolas да, я знаю об этом, но мне было интереснее, где именно размещать сессию для её правильного расположения.

user9447 user9447
24 авг. 2016 г. 22:32:37
Все ответы на вопрос 3
2

Обычного вывода нет, и, следовательно, заголовки не отправляются до хука template_redirect на фронтенде. Если вам нужны сессии и в бэкенде, используйте действие wp_loaded, чтобы охватить оба случая.

Пример:

add_action( 'template_redirect', function() {

    $status = session_status();

    if ( PHP_SESSION_DISABLED === $status ) {
        // Вот почему нельзя полагаться на сессии!
        return;
    }

    if ( PHP_SESSION_NONE === $status ) {
        session_start();
    }

    $_SESSION[ 'foo' ] = 'bar';
});

Помните, что использование сессий добавляет целый набор очень сложных проблем в ваш код, включая вопросы безопасности, масштабируемости (балансировщики нагрузки) и последующие трудоемкие вопросы поддержки. Я не рекомендую их использовать.

25 авг. 2016 г. 00:18:34
Комментарии

Хорошо, если сессии работают плохо, я думаю, стоит посмотреть на PHP-функцию 'set_cookie()'. Полагаю, здесь можно применить такой же подход, как у вас - использовать 'template_redirect' или 'wp_loaded'?

user9447 user9447
25 авг. 2016 г. 01:52:17

Я нашел этот небольшой документ весьма информативным, по крайней мере в части проблем с сессиями в WordPress: https://pressjitsu.com/blog/wordpress-sessions-performance/

MikeiLL MikeiLL
25 мар. 2017 г. 06:57:17
0

Вот еще одно решение, которое подходит для всех версий PHP, и вы можете найти его в плагине CF Geo:

if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
    if(function_exists('session_status') && session_status() == PHP_SESSION_NONE) {
        session_start(array(
          'cache_limiter' => 'private_no_expire',
          'read_and_close' => false,
       ));
    }
}
else if (version_compare(PHP_VERSION, '5.4.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') >= 0){
            session_cache_limiter('private_no_expire');
        }
        session_start();
    }
}

С этим решением вы можете избежать любых проблем с сессиями и запускать их в любое время, когда это необходимо.

21 дек. 2018 г. 15:29:28
1

Мы можем использовать простой способ через хук init. Добавьте эту функцию в файл function.php

function register_my_session() {
  if( !session_id() )
  session_start();
}
add_action('init', 'register_my_session');

После добавления этой функции в function.php вы можете устанавливать значения в сессии, например:

$_SESSION['user_country'] = 'india';

Получить значение из сессии:

echo $_SESSION['user_country'];

Для удаления значения из сессии:

unset($_SESSION["user_country"]);
8 июл. 2021 г. 13:48:06
Комментарии

Вам следует экранировать значения сессии перед их выводом.

fuxia fuxia
8 июл. 2021 г. 18:54:53