Вопрос или проблема
Я использую только “страницы” из моей установки WP (не записи), и я хочу установить куки на основе существования параметра GET в URL.
Я вставил следующий код в верхнюю часть моего page.php:
if ( get_query_var('value') ) {
$value=get_query_var('value');
setcookie( 'value',$value, time() + 2592000, COOKIEPATH, 'domain.com' );
}
Так что если я посещаю URL, например: www.domain.com/page/?value=1234, я хочу установить куки: value: 1234 для этого домена.
Проблема в том, что это не всегда работает (кажется, работает около 70% времени), и иногда куки не устанавливаются.
У меня включены плагины Autoptimize и WP Super Cache, а также CF в качестве CDN.
Что я попробовал:
Я далек от эксперта в WP, но понимаю, что есть возможность добавить функцию в functions.php с той же целью, но я не смог заставить это работать таким образом.
Имеет ли значение, где в теле page.php я размещаю этот код (должен ли он быть ниже, чтобы его всегда выполняли?), или есть ли другой способ убедиться, что код выполняется постоянно.
Я знаю, что есть способы установки куки с помощью JS, но я предпочел бы сделать это с помощью PHP.
Отвечая на свой собственный пост, кажется, что WP Super Cache имеет специальную настройку (в разделе Расширенные), чтобы не кэшировать URL с параметром GET. После того как это установлено, проблема, похоже, больше не воспроизводится.
Таким образом, истинная причина проблемы в том, что кэшированные файлы больше не выполняют PHP-код, и, следовательно, установка куки из PHP не выполняется, и, вероятно, JS – более подходящий вариант.
Существуют и другие способы решить проблему установки куки конкретно, например, посмотрите на функционал wpsc_add_cookie.
Ответ или решение
Почему установка cookies из URL-параметров не всегда работает?
Установка cookies на основе параметров URL в контексте WordPress (WP) может показаться простой задачей, однако на практике она подвержена различным влияниям, что может приводить к непредсказуемым результатам. Один из основных аспектов, о которых следует помнить, заключается в том, как работает кэширование и обработка PHP-кода в WordPress.
Контекст проблемы
В приведённом вами коде на PHP вы пытаетесь установить cookie на основании GET-параметра в URL. Вы делаете это следующим образом:
if ( get_query_var('value') ) {
$value = get_query_var('value');
setcookie('value', $value, time() + 2592000, COOKIEPATH, 'domain.com');
}
При попытке установить cookie, когда пользователь переходит на страницу, например, http://www.domain.com/page/?value=1234
, у вас возникает проблема: cookie устанавливается только в 70% случаев.
Причины нестабильной работы
-
Кэширование: Кэширование — один из основных виновников того, почему ваш код не всегда срабатывает. Плагины, такие как WP Super Cache, создают статические HTML-страницы и игнорируют PHP-код, который не выполняется для закэшированных страниц. Это означает, что если страница загружена из кэша, код для установки cookie не будет выполнен.
Вы правильно обратили внимание на то, что в разделе "Дополнительно" WP Super Cache есть настройка, позволяющая не кэшировать URL с GET-параметрами. Это должно решить вашу проблему.
-
Порядок выполнения кода: Код, который вы вставили в
page.php
, важно располагать в нужном месте. Убедитесь, что он выполняется до того, как браузер начнет выводить HTML-контент. Оптимальным вариантом будет размещение его в начале файла, до любых echo, print или вызовов функций, которые генерируют выходной HTML. -
Проблемы с настройками сервера: Если ваш сервер настроен на использование дополнительных механизмов кэширования, таких как Varnish или OpCache, это также может препятствовать правильному выполнению вашего кода.
-
Настройки Cookie: При установке cookie важны параметры, такие как путь и домен. Вы используете
'domain.com'
в качестве домена. Убедитесь, что это значение совпадает с доменом, на котором вы тестируете. В случае несоответствия cookie может не устанавливаться.
Альтернативные решения
Если вы продолжаете сталкиваться с проблемами, рассмотрите следующие варианты:
-
JavaScript для установки cookie: Как вы уже упомянули, установка cookies через JavaScript может быть более надежным решением, особенно в случае кэшированных страниц.
-
Хук в functions.php: Вы можете создать функцию в
functions.php
, которая будет вызываться при каждой загрузке страницы. Например:add_action('init', 'set_custom_cookie'); function set_custom_cookie() { if (isset($_GET['value'])) { $value = sanitize_text_field($_GET['value']); setcookie('value', $value, time() + 2592000, COOKIEPATH, 'domain.com'); } }
Этот код будет выполняться на этапе инициализации WordPress и должен работать независимо от кэширования, если, конечно, не переопределяется кэш.
Заключение
Вопрос установки cookies из URL-параметров в WordPress требует внимательного подхода к кэшированию и порядку выполнения кода. Настройка кэширования и правильное размещение кода могут значительно повысить стабильность работы. Оптимизируйте код и учитывайте различные аспекты вашего сайта для достижения желаемого результата.