Вопрос или проблема
Я хочу показать всплывающее окно первому посетителю сайта на WordPress. Я пытался проверить состояние визита, используя $_SESSION
. Что-то вроде этого в footer.php:
<?php
if(!isset($_SESSION['pxpop']))
$_SESSION['pxpop']= true;
if(($_SESSION['pxpop']) && (!is_user_logged_in()))
{
?>
<div class="open_initpop">
<?php if(is_active_sidebar('msg-pop')): ?>
<?php dynamic_sidebar('msg-pop'); ?>
<?php endif; ?>
</div>
<?php
$_SESSION['pxpop']= false;
}
?>
с session_start();
в хуке init
файла functions.php.
Но это не работает. $_SESSION['pxpop']
остается true
при каждой загрузке страницы. Поэтому всплывающее окно открывается на каждой странице.
С небольшим исследованием я выяснил, что из-за проблемы с ‘безсостоянием’ WordPress не использует сессии. В разделе состояния сайта также говорится:
“PHP сессии, созданные вызовом функции session_start(), могут мешать REST API и запросам loopback. Активная сессия должна быть закрыта с помощью session_write_close() перед выполнением любых HTTP-запросов.”
Затем я пытался реализовать $_COOKIE
тоже (в хуке init
) как:
<?php
function pop_event()
{
if(!isset($_COOKIE['pxpop']))
{
setcookie('pxpop', true, 0);
//$_COOKIE['pxpop']= true;
}
if(($_COOKIE['pxpop']) && (!is_user_logged_in()))
{
?>
<div class="open_initpop">
<?php if(is_active_sidebar('msg-pop')): ?>
<?php dynamic_sidebar('msg-pop'); ?>
<?php endif; ?>
</div>
<?php
//unset($_COOKIE['pxpop']);
//$_COOKIE['pxpop']= false;
setcookie('pxpop', false, 0);
}
}
?>
Но это тоже не работает…
Что не так с моим подходом? Какой правильный способ передать значение в WordPress, подобно PHP сессии, не используя её? Или использование $_SESSION – это единственный выход?
Вы можете просто использовать куки, как вы пытались. Проблема в том, что ваша логика постоянно добавляет куки. Это происходит потому, что setcookie('pxpop', false, 0);
удаляет куки у пользователя, и вы попадаете в цикл. Это логика вашего кода:
ЕСЛИ у пользователя нет куки
дайте пользователю куку
КОНЕЦ ЕСЛИ
ЕСЛИ у пользователя есть кука
отобразить всплывающее окно
взять куку
КОНЕЦ ЕСЛИ
Поэтому вы видите, почему ничего не изменится при каждой загрузке, потому что пользователь никогда не посещает страницу с кукой.
Что вам нужно сделать:
ЕСЛИ у пользователя нет куки
отобразите всплывающее окно
дайте пользователю куку
КОНЕЦ ЕСЛИ
Кроме того, ваша кука устанавливается на истечение срока действия, когда заканчивается сеанс браузера, поэтому она не продлится долго в любом случае.
Решение обеих проблем выглядело бы так:
<?php
function pop_event() {
if ( ! isset( $_COOKIE['pxpop'] ) ) {
if ( is_active_sidebar( 'msg-pop' ) ) {
?>
<div class="open_initpop">
<?php dynamic_sidebar('msg-pop'); ?>
</div>
<?php
setcookie( 'pxpop', true, YEAR_IN_SECONDS );
}
}
}
Имейте в виду, что это решение не будет совместимо со многими решениями для кэширования. Моя рекомендация – реализовать это полностью на клиенте, поскольку вы, вероятно, будете использовать JavaScript для всплывающего окна.
Спасибо за ответ, данный @Jacob Peattie. Я реализовал это на JavaScript. Вот код:
function pop_message()
{
var popshow= sessionStorage.getItem("pxpop");
if((popshow==null) || (popshow==''))
popshow=false;
if(($(".open_initpop").length >0) && (popshow==false))
{
$(".open_initpop").dialog({'autoOpen': true, 'modal':true, 'width':500, 'dialogClass': 'initpop_dlg', 'hide': {'effect': "clip", 'duration': 250}, 'buttons':{'close': function(){
$(this).dialog( "close" );}}});
sessionStorage.setItem("pxpop", true);
}
}
Просто вызовите функцию pop_message()
в $(document).ready
Ответ или решение
Как реализовать альтернативу $_SESSION в WordPress без использования плагинов
При разработке темы WordPress для отображения всплывающего окна для первых посетителей сайта, важно учитывать, что стандартное использование $_SESSION
может вызвать проблемы с совместимостью, особенно с REST API и другими запросами. Вместо этого рекомендуется использовать куки или JavaScript, чтобы избежать этих осложнений.
Проблема с использованием $_SESSION
При использовании $_SESSION
, несмотря на правильное вызов session_start()
в хуке init
вашего файла functions.php
, вы столкнетесь с проблемами, связанными с «бессостоянием» WordPress. Данные сессии могут сохраняться некорректно между страницами, в результате чего всплывающее окно показывается для каждого визита, даже для повторных посетителей.
Подход с использованием куки
Первый вариант – это использование куки. Тем не менее, в вашем исходном коде есть некоторые недоработки, которые мешают правильной работе.
Исправленный код с куки
Вот оптимизированный код, который решает все обозначенные проблемы:
function pop_event() {
if ( ! isset( $_COOKIE['pxpop'] ) ) {
// Отображение всплывающего окна
if ( is_active_sidebar( 'msg-pop' ) ) {
?>
<div class="open_initpop">
<?php dynamic_sidebar('msg-pop'); ?>
</div>
<?php
// Установка куки на 1 год
setcookie( 'pxpop', 'true', time() + YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
}
}
}
add_action( 'wp_footer', 'pop_event' );
Обратите внимание:
- Кука
pxpop
устанавливается на 1 год, чтобы обеспечить продолжительность между визитами. - Никаких дополнительных действий с кукой после ее установки не требуется: если пользователю показано всплывающее окно, кука не будет создана повторно.
Альтернативный подход через JavaScript
Наиболее эффективный и динамичный способ – это использование JavaScript. Вы можете использовать sessionStorage
для отслеживания, был ли уже показан пользователю всплывающее окно:
function pop_message() {
var popshow = sessionStorage.getItem("pxpop");
if (popshow == null) {
popshow = false;
}
if ($(".open_initpop").length > 0 && popshow == false) {
$(".open_initpop").dialog({
'autoOpen': true,
'modal': true,
'width': 500,
'dialogClass': 'initpop_dlg',
'hide': {'effect': "clip", 'duration': 250},
'buttons': {
'close': function() {
$(this).dialog("close");
}
}
});
sessionStorage.setItem("pxpop", true);
}
}
jQuery(document).ready(function($) {
pop_message();
});
Преимущества JavaScript подхода
- Легкость в реализации: С помощью JavaScript вы обеспечиваете большую гибкость и контроль над отображением всплывающего окна.
- Высокая производительность: Не требуя излишнего использования серверных ресурсов и куки, JavaScript решает большинство проблем с производительностью.
- Интуитивный интерфейс: Пользовательские диалоговые окна могут быть легко настроены и стилизованы, что улучшает общее восприятие сайта посетителями.
Заключение
Выбор между использованием куки и JavaScript зависит от ваших дизайнерских предпочтений и технических требований сайта. Однако использование JavaScript с sessionStorage
является более современным подходом, который способствует созданию более интерактивного пользовательского опыта. Убедитесь, что вы тестируете удаленные куки и JavaScript решения на различных устройствах и браузерах для обеспечения их совместимости и корректной работы.