Intereting Posts
Виджет с одним контентом на нескольких веб-сайтах Можно ли переопределить эту функцию / класс в дочерней теме? Удостовериться, что записи отношений терминалов wp уникальны Как изменить ярлык «Комментарии» на «Обзор» повсюду в WP-установке без перевода Сервер Apache на Bitnami WAMP Stack без доступа к странице плагинов Динамическое создание пользовательского мета поля Как игнорировать рассылки для RSS-ленты? Как разрешить редактирование текста на боковой панели? Каков наиболее эффективный метод базы данных для добавления и запроса usermeta? Проблемы с изображениями после импорта резервной копии базы данных на мой локальный веб-сервер Есть ли крючки для комментариев? Крюк или функция загрузки медиа через URL-адрес Как я могу получить кого-то для проверки, как только они добавят продукт в корзину? Список архивов для категорий пользовательских сообщений Безопасность и .htaccess

Как хранить или кэшировать пользовательские данные корзины покупок для сеанса каждого пользователя

Я разрабатываю корзину покупок, и я не хочу использовать какие-либо плагины, так как никто из них не может удовлетворить мои потребности. Поэтому я собираюсь создать свою собственную корзину покупок.

Мой вопрос: как хранить то, что пользователь добавил в свою корзину?

Я прочитал о wp_cache и о Transients API.

Они достаточно безопасны?

Есть ли другой лучший способ?

Solutions Collecting From Web of "Как хранить или кэшировать пользовательские данные корзины покупок для сеанса каждого пользователя"

Переходные процессы можно использовать, но вам нужно убедиться, что они не истекают раньше, чем вы хотите.

Я ответил на аналогичный вопрос с другой целью здесь , но я попытался сохранить немного другой ответ ниже автономного.

Вариант 1 – сеансы PHP

Я хранил тележки в PHP-сессии, что нормально, но иногда имеет несколько проблем. Поэтому, пока он работает, я рекомендую что-то более надежное.

Мой код плагина использует объект Basket. На крючке init я запускаю сеанс PHP, и если в сеансе есть сериализованный объект корзины, я несериализую его в глобальный, иначе я создаю новую корзину в глобальную.

На крючке shutdown я сериализую свой объект в сеанс.

 function setup_session() { global $Basket; session_start(); if (isset($_SESSION['basket'])) { $Basket = unserialize($_SESSION['basket']); } else { $Basket = new Basket(); } $Basket->do_actions(); // my own hooks to allow me to add housekeeping code without messing with my core codde } function save_session() { global $Basket; if (isset($Basket)) { $_SESSION['basket'] = serialize($Basket); } } add_action( 'init', 'setup_session' ); add_action( 'shutdown', 'save_session' ); // works even when redirecting away from a page 

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

Вариант 2 – лучшие сеансы

Здесь есть WP Session framework, написанный Эриком Манном и хорошо объясненный Пиппином, который использует его в своем известном плагине Easy Digital Downloads. Вы используете глобальный $ wp_session точно так же, как и $ _SESSION, но также есть вспомогательные функции для управления сеансами. Это использует переходные процессы WP для хранения, но также правильно обрабатывает время истечения срока, чтобы ваши корзины не очищались слишком рано.

Я перейду к этому на своих сайтах, когда я хорошо посмотрю, как это работает для меня.

Мы стараемся не посылать вас, следуя другим ссылкам в ответах здесь, поскольку они могут не длиться, но вытащить их обоих здесь приведет к довольно длинному ответу.

Вариант 3 – Вход пользователя

Если вы не требуете, чтобы покупатели делали учетную запись, то этот подход не для вас, если вы не хотите кодировать концепцию анонимного пользователя, а затем конвертируете свою корзину в одну для зарегистрированного пользователя при создании своей учетной записи. Если вам требуются учетные записи пользователей, то это путь, по которому вы можете передать управление сеансом в встроенные логины пользователей WP. Затем в режиме init & shutdown вы можете несериализировать и сериализовать свою корзину в пользовательское мета-поле, которое будет сохраняться между сеансами входа в систему.

Хотя update_user_meta будет обрабатывать сериализацию для вас, помните об этой давней ошибке при попытке сохранить объект.