Использовать сессию вместо IP: $_SESSION[] и саму корзину (набранные товары туда) сохранять в LocalStorage через JS на клиенте как список ID-шников.
Чтобы при истечении времени сессии, товары из корзины не пропадали.
Если клиент уже имеет учётку - мы сохраняем корзину в базу данных, чтобы сделать её доступной на любом другом устройстве сразу же после авторизации.
При создании новой сессии мы корзину синхронизируем с сайтом, если корзина аккаунта пуста:
1. Если в LocalStorage не пусто
2. Или удалённая корзина пуста
- используем локальную версию и позже отправляем на сервер.
Если клиент залогинился - проверяем наличие серверной корзины.
При несовпадении локального и удалённого набора товаров, предлагаем выбрать один из двух вариантов: локальную корзину или удалённую корзину аккаунта.
При создании новой сессии, корзину синхронизируем с сайтом, основываясь на наличии и, если некоторые товарные позиции закончились на складе, - предлагаем наиболее подходящие альтернативные замены.
Заботьтесь о клиентах, чтобы они заботились о вашей прибыли!