Функция SetCookie не работает в WordPress
У меня не получается правильно установить 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).

Убедитесь, что HTTP-заголовки ещё не были отправлены в момент, когда вы хотите установить cookie. Вот как можно это проверить:
function set_cookie() {
var_dump(headers_sent()); // должно быть bool(false)
...
Включение WP_DEBUG
в вашем файле config.php также может помочь при отладке.
Кстати, вам действительно стоит выполнить фильтрацию для $_GET['id']
. Эта переменная может содержать что угодно. Приведение её к (положительному) целому числу значительно улучшит ситуацию:
$referrerID = absint($_GET['id']); // Примечание: absint() — это функция WordPress

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

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

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

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

Какой будет лучший способ получить такие заголовки? Я использовал этот код только что, но не думаю, что это то, что вы искали:
foreach (getallheaders() as $name => $value) { echo "$name: $value\n"; }

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

Вот мои результаты теста - я устанавливаю куки "referrerid" со значением "1". Вроде всё выглядит правильно, почему же оно не устанавливается, как думаете, исходя из этих результатов?
http://www.webpagetest.org/result/120119_V7_2XVFT/1/details/cached/

Другой вариант — использовать 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 обработает страницу.
Надеюсь, это поможет.
