AlekseySychev
@AlekseySychev
Программирую в небольшой веб-студии.

Почему сессия сбрасывается у неавторизованного пользователя без корзины?

Пытаюсь добавить в сессию данные о просмотренных товарах.
Но если пользователь еще не пользовался корзиной или не авторизован, то данные сесии сбрасываются каждое обновление странички.
Как быть? Наверняка есть какой то return false фильтер, но найти не могу.
Спасибо.

Код для проверки на странице шаблона использую такой:
echo "<pre>";
$viewed = WC()->session->get('viewedProducts');
echo "Переменная до установки" . PHP_EOL;
var_dump($viewed);
WC()->session->set('viewedProducts', 1);
$viewed = WC()->session->get('viewedProducts');
echo "Переменная после установки" . PHP_EOL;
var_dump($viewed);
echo "</pre>";

Если пользователь не пользовался корзиной или не авторизован, то спустя пару обновлений странички ничего не меняется.
Переменная до установки
NULL
Переменная после установки
int(1)

Нормальная работа идет если пользовался корзиной или авторизован
Переменная до установки
int(1)
Переменная после установки
int(1)
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
AlekseySychev
@AlekseySychev Автор вопроса
Программирую в небольшой веб-студии.
Я буду проклят за этот код, но копание в плагине в общих чертах дало наводку.
functions.php
// сохранение просмотренных товаров
add_action('template_redirect', function() {
    if (is_product()) {
        global $post;
        // поллучаем из ссесии
        $viewedProducts = WC()->session->get('viewed-products', array());
        // удаляем текущую, если она есть
        $viewedProducts = array_filter($viewedProducts, function($item) use($post) {
            if ($post->ID == $item) return false;
            else return true;
        });
        // добавляем текущий товар в начало списка
        array_unshift($viewedProducts, $post->ID);
        // сохраняем список в сессии
        WC()->session->set('viewed-products', $viewedProducts);
        // если для текущего пользователя нет сессии, сохраняем ее
        if (!WC()->session->has_session()) {
            WC()->session->set_customer_session_cookie(true);
        }
    }
});

получение ids просмотренных:
// получаем список из сессии
$viewedProducts = WC()->session->get('viewed-products', array());
// больше 1, так как текущий не отображаем
if( count($viewedProducts) > 1 ) {
    foreach ($viewedProducts as $viewed_id) {
        // пропускаем текущий
        if ($post->ID == $viewed_id) continue;
        // получаем товар
        $viewed = new WC_Product($viewed_id);
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы