Функция SetCookie не работает в WordPress

19 янв. 2012 г., 09:23:44
Просмотры: 13.6K
Голосов: 1

У меня не получается правильно установить cookie через тему WordPress. Я размещаю следующий код в конце файла functions.php моей темы.

function set_cookie() {
    if (isset($_GET['id'])) {
        $referrerID = $_GET['id'];
        setcookie('referrerid', $referrerID, time() + 3600 * 24, COOKIEPATH, COOKIE_DOMAIN, false);
    }
}
add_action('init', 'set_cookie');

Я даже проверял с помощью JavaScript, достигает ли скрипт функции (и он действительно достигает).

Почему мои cookies не устанавливаются? (Код работает локально - вне WordPress).

php
0
Все ответы на вопрос 2
9

Убедитесь, что HTTP-заголовки ещё не были отправлены в момент, когда вы хотите установить cookie. Вот как можно это проверить:

function set_cookie() {
  var_dump(headers_sent()); // должно быть bool(false)
  ...

Включение WP_DEBUG в вашем файле config.php также может помочь при отладке.


Кстати, вам действительно стоит выполнить фильтрацию для $_GET['id']. Эта переменная может содержать что угодно. Приведение её к (положительному) целому числу значительно улучшит ситуацию:

$referrerID = absint($_GET['id']); // Примечание: absint() — это функция WordPress
19 янв. 2012 г. 10:57:25
Комментарии

Я могу разместить эту функцию где угодно, и как она даст мне знать результаты? Она выводит информацию с помощью echo?

Evan Evan
19 янв. 2012 г. 15:25:34

Да, var_dump() выводит свои результаты.

Geert Geert
19 янв. 2012 г. 16:04:36

Он вернул bool(false) - но куки всё ещё не устанавливаются. Есть ли возможность устроить приватный чат, если у вас есть свободная минутка?

Evan Evan
19 янв. 2012 г. 16:05:51

Сейчас это невозможно. Можете проверить заголовки HTTP-ответа? Ищите заголовок Set-Cookie.

Geert Geert
19 янв. 2012 г. 16:15:27

Какой будет лучший способ получить такие заголовки? Я использовал этот код только что, но не думаю, что это то, что вы искали:

foreach (getallheaders() as $name => $value) { echo "$name: $value\n"; }

Evan Evan
19 янв. 2012 г. 16:21:30

Вы можете использовать инструмент вроде Firebug для проверки HTTP-запроса. Онлайн-инструмент, такой как http://www.webpagetest.org/, также подойдет.

Geert Geert
19 янв. 2012 г. 17:01:55

Вот мои результаты теста - я устанавливаю куки "referrerid" со значением "1". Вроде всё выглядит правильно, почему же оно не устанавливается, как думаете, исходя из этих результатов?

http://www.webpagetest.org/result/120119_V7_2XVFT/1/details/cached/

Evan Evan
19 янв. 2012 г. 17:42:45

Вы уверены, что ваш браузер принимает куки с домена вашего сайта?

Geert Geert
19 янв. 2012 г. 17:47:19

ОБНОВЛЕНИЕ - Да, Chrome принимает куки.

Я знаю, что могу использовать куки (я использовал тот же код вне WordPress и он работал нормально). Как я могу проверить, принимаются ли они с конкретного домена? Пока что погуглю это.

Evan Evan
19 янв. 2012 г. 17:49:54
Показать остальные 4 комментариев
0

Другой вариант — использовать PHP функции ob_start(); и ob_end_flush();.

Документацию по этим двум функциям можно найти здесь

Я решил свою проблему, вызвав эти две функции до и после открывающих и закрывающих HTML-тегов, вот так:

<?php ob_start(); ?>
<!DOCTYPE html>
<html>
  <head>
  </head>
<body>
  <?php /* Цикл WordPress и другой шаблонный код здесь */ ?>
</body>
</html>
<?php ob_end_flush(); ?>

Проблема, с которой я столкнулся, заключалась в вызове глобальной функции, использующей PHP-функцию setcookie();. Поскольку WordPress обрабатывает страницу постепенно, cookie не мог быть создан из-за того, что заголовки страницы уже были отправлены.

Функция буферизации вывода PHP принудительно отправляет заголовки до того, как WordPress обработает страницу.

Надеюсь, это поможет.

29 окт. 2015 г. 23:48:54