Логика работы корзины следующая:
Когда пользователь неавторизован:
- Товары попадают в БД и связаны по session_id
(логика видна в методе \Shop\Model\Cart::__construct)
Когда пользователь авторизовывается и у него есть товары в корзине:
- Товары, которые были привязаны user_id до этого удаляются (т.к. пользователь собрал новую корзину)
- Новые товары дополнительно привязываются к user_id
Когда пользователь авторизовывается и у него нет товаров в корзине
- Товары, которые были привязаны к user_id привязываются к session_id
(т.е. пользователь видит товары, которые он собирал будучи авторизованным, например, на другом компьютере)
(логика трансформаций при авторизации видна в \Shop\Config\Handlers::userAuth)
Когда пользователь авторизован:
- Товары попадают в БД и у них проставляются session_id, user_id
------------------------------------
Выборка товаров в корзину из БД ведется всегда по session_id. (user_id - это дополнительный идентификатор, который позволяет производить манипуляции по перепривязке товаров при авторизации)
Теоретически, корзина может пропадать у пользователей, только если наступает завершение сессии, т.е. происходит смена session_id, т.е. пауза между действиями пользователя на сайте превышает настройку session.gc_maxlifetime в php.ini