客户从一个 Store View 切换语言或站点后购物车突然为空。若跨 Website,购物车隔离可能是设计行为;同一 Website 内切换仍清空,则要检查 Session、Quote 激活状态、商品网站分配与自定义 Store Switcher。

先固定复现条件和影响范围

记录切换前后 store_id、website_id、Session 是否保持、active quote_id、SKU 网站分配和货币。分别测试同 Website 的两个 Store View 与跨 Website 切换。

SELECT store_id,code,website_id,group_id FROM store ORDER BY website_id,store_id;
SELECT entity_id,store_id,is_active,customer_id,items_count,quote_currency_code,updated_at
FROM quote WHERE entity_id IN (12345,12346);
SELECT product_id,website_id FROM catalog_product_website
WHERE product_id IN (SELECT product_id FROM quote_item WHERE quote_id=12345);
php bin/magento config:show checkout/options/enable_agreements

根据证据分支定位

Session ID 改变,查 Cookie Domain、Path 和 Base URL;Session 相同但创建新 Quote,查 website 隔离和切换代码;Quote 保留而商品被移除,查目标网站分配、可售量、价格和必选选项。仅显示空但接口有 items,则属于 customer-data 前端刷新问题。

修复时保留回滚路径

先明确业务是否允许跨 Website 共享购物车。同 Website 切换应复用或安全转换 Quote;跨 Website 若需要迁移,应逐项重新验证商品、库存、价格、税和币种,不能只改 quote.store_id。

上线验收

覆盖访客与登录客户、同 Website、跨 Website、可售与不可售商品、优惠码和不同币种。切换结果应符合明确规则,不能静默丢失商品;被移除项目需给出可理解提示。

生产环境操作前的检查

处理“Magento 2 切换商店后购物车变空”前,先记录 Magento 版本、部署模式、问题 Store View、复现时间和最近一次发布。所有 SQL 默认先执行 SELECT;任何写操作、目录清理或配置切换都应确认影响范围、保留备份并准备回滚。多节点环境要核对各节点代码版本、app/etc/env.php 配置摘要与流量分布。

php bin/magento --version
php bin/magento deploy:mode:show
php bin/magento maintenance:status
php bin/magento indexer:status
php bin/magento cache:status

命令应由 Magento 文件所有者在项目根目录执行。不要在生产高峰同时运行全量索引、静态部署和数据修复;涉及客户、支付、税费或订单的改动,先在脱敏数据副本验证。

建立可比较的排查记录

每次实验只改变一个变量,记录操作前值、命令、开始与结束时间、结果和回滚方式。准备一个正常对象与一个异常对象对照;若旧对象恢复而新对象仍能复现,说明根因尚未消除。

检查层需要保存的证据通过标准
入口层 URL、状态码、请求 ID、节点 路由和协议一致
应用层 异常堆栈、模块、作用域 无新异常且可重复
数据层 主键、时间、关联行数 关系完整且无重复副作用
业务层 正常、失败、重试路径 最终结果一致

修复后的观察窗口

上线后至少观察一轮 Cron、队列和索引周期,并在两台节点、无痕浏览器和目标 Store View 重复验证。临时调试日志必须脱敏,确认错误率、响应时间和数据量稳定后及时关闭。