客户能正常登录账户中心,但 My Orders 显示没有订单,后台按邮箱却能找到历史记录。订单列表不是单纯按 email 查询,它主要依赖当前登录客户的 customer_id、订单可见状态和网站上下文。相同邮箱并不保证自动关联。
先比较订单 customer_id 与当前客户实体
SELECT entity_id, increment_id, customer_id, customer_email,
store_id, state, status, is_active, created_at
FROM sales_order
WHERE customer_email='customer@example.test'
ORDER BY entity_id DESC;
访客订单的 customer_id 可能为空,即使下单邮箱与后来注册客户相同,也不会自动出现在账户中。Magento 不应仅按邮箱展示订单,否则共享邮箱或邮箱变更会造成隐私泄露。
多 Website 的客户实体可能不同
客户账户共享范围为 Per Website 时,同一邮箱可以在不同 Website 拥有不同 customer_id。订单属于另一个 Website/Store 的客户实体,当前站点登录后可能看不到。检查 customer_entity 的 website_id 与订单 store 对应关系。
如果业务要求跨网站共享订单,需要明确身份映射与权限,不能简单去掉 website 过滤。统一账户范围的配置变更也可能影响重复邮箱和现有客户,必须先评估迁移。
订单状态和扩展会改变列表条件
核心订单历史通常会显示多数有效订单,但主题、B2B、Marketplace 或隐私模块可能过滤 canceled、closed、归档订单或特定渠道。切换原生主题/停用相关插件做对照,查看订单集合最终 SQL 与过滤条件。
后台能看见但前台 GraphQL/REST 查询看不见时,检查当前 customer token 与 customer_id 是否匹配,以及接口的 Store 头。不要使用管理员 Token 的结果判断客户权限。
合并访客订单必须有安全规则
有些扩展在客户注册或登录后按邮箱把 guest orders 绑定到账户。实现必须验证客户对邮箱的所有权,处理历史邮箱变更和多网站范围,并保留审计。直接批量更新 sales_order.customer_id 会遗漏订单 Grid、扩展索引或第三方映射。
缓存问题通常只影响显示,不影响集合
账户页面属于私有内容,但前端 customer-data 或自定义全页缓存配置错误,也可能缓存空列表。检查实际订单接口响应:数据已返回而页面为空,问题在模板/JS;接口本身为空,继续查权限和集合。
修复后测试已有客户订单、访客订单、不同 Website 同邮箱、取消订单和邮箱变更。确认客户只能看到属于自己的订单,订单详情、下载产品、发票和退款入口也遵循同一授权规则。

