@Aricus

Почему не устанавливаются cookie в Wordpress?

Пишу в footer.php в теме wordpress:
setcookie('testing', '123', time() + (86400 * 30), "/");
var_dump($_COOKIE['testing']);

Обновляю страницу несколько раз, каждый раз выдаёт null. Пробовал по совету из интернета делать так:
add_action( 'init', 'my_setcookie_example' );
function my_setcookie_example() {
	setcookie('testing', '123', 30 * DAYS_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
}
var_dump($_COOKIE['testing']);

Результат тот же. При этом внутри ajax:
add_action('wp_ajax_changecart', 'changecart_callback');
add_action('wp_ajax_nopriv_changecart', 'changecart_callback');
function changecart_callback() {
	...
	$cartQuantity = (int)$_COOKIE['cartQuantity'] + (int)$_POST['quantity'] - $cartGoods[(int)$_POST['id']];
	...
	setcookie('cartQuantity', $cartQuantity, time() + (86400 * 30), "/"); 
	...
	wp_die();
}

всё отлично работает, но только внутри ajax. Если попытаться получить $_COOKIE['cartQuantity'] на странице, то опять же выдаст null.
  • Вопрос задан
  • 1398 просмотров
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Из документации (жирным выделил то, что важно):
setcookie() задает cookie, которое будет передано клиенту вместе с другими HTTP-заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться до остального вывода, включая вывод тегов и , а также пустые строки и пробельные символы.

Из-за этого не работает в footer.php. Если бы у вас был включен режим отладки и вывод ошибок, то вы бы увидели что-то типа:
Warning: Cannot modify header information - headers already sent by (output started at /Users/Ihor/Code/playground/wp-includes/class.wp-styles.php:242) in /Users/Ihor/Code/playground/wp-content/themes/playground/footer.php on line 8

Далее, пример с хуком init работает, но есть 2 нюанса. Во-первых, у вас ошибка - константы DAYS_IN_SECONDS не существует, должна быть DAY_IN_SECONDS. Далее, опять идем в документацию по поводу этого параметра (жирным выделил то, что важно):
expires
Время, когда срок действия cookie истекает. Это метка времени Unix, то есть количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time(), прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime(). time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечет с окончанием сессии (при закрытии браузера).

На языке кода это будет:
function my_setcookie_example()
{
	setcookie(
		'testing',
		'123',
		time() + 30 * DAY_IN_SECONDS, // вот так должно быть
		COOKIEPATH,
		COOKIE_DOMAIN
	);
}
add_action( 'init', 'my_setcookie_example' );

Во-вторых, из той же документации (жирным выделил то, что важно):
После передачи клиенту cookie станут доступны через массив $_COOKIE при следующей загрузке страницы. Значения cookie также есть в $_REQUEST.

То есть, ваше var_dump($_COOKIE['testing']); сработает только после перезагрузки, а при первой попытке - NULL и:
Notice: Undefined index: testing in /Users/Ihor/Code/playground/wp-content/themes/playground/functions.php on line 134
.

RTFM.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы