Как реализовать альтернативу $_SESSION в WordPress внутри темы без плагина?

Вопрос или проблема

Я хочу показать всплывающее окно первому посетителю сайта на 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 подхода

  1. Легкость в реализации: С помощью JavaScript вы обеспечиваете большую гибкость и контроль над отображением всплывающего окна.
  2. Высокая производительность: Не требуя излишнего использования серверных ресурсов и куки, JavaScript решает большинство проблем с производительностью.
  3. Интуитивный интерфейс: Пользовательские диалоговые окна могут быть легко настроены и стилизованы, что улучшает общее восприятие сайта посетителями.

Заключение

Выбор между использованием куки и JavaScript зависит от ваших дизайнерских предпочтений и технических требований сайта. Однако использование JavaScript с sessionStorage является более современным подходом, который способствует созданию более интерактивного пользовательского опыта. Убедитесь, что вы тестируете удаленные куки и JavaScript решения на различных устройствах и браузерах для обеспечения их совместимости и корректной работы.

Оцените материал
Добавить комментарий

Капча загружается...