配送日期选择器负责展示日期,校验负责执行日期。 在 Shopify 上,校验指的是购物车与结账校验 Function:它在付款前于 Shopify 服务器上运行,一旦日期缺失、已关闭或已满,就拦下订单。它适用于所有 Shopify 套餐,也覆盖每一种进入结账的方式,包括 Shop Pay、Apple Pay 和 Buy it now。只有在结账页面内部显示选择器才需要 Plus。
为什么只有选择器会放过错误日期
商品页或购物车页上的选择器只是展示。它在顾客的浏览器里把已关闭和已满的日期置灰,仅此而已。出现下面这些情况时,没有有效日期的订单仍会通过:
- 顾客使用快捷按钮。 商品页上的 Buy it now、Shop Pay、Apple Pay 和 Google Pay 直接进入结账,所以购物车选择器根本不会运行。参见 Buy It Now 会跳过配送日期。
- 付款期间日期被订满了。 页面加载时选择器显示「还剩 1 个」,别人抢先订走了。
- 购物车是昨天的。 顾客选好日期,过了截单时间才回来结账。
- 购物车抽屉不显示选择器, 或者主题更新后选择器区块被移除了。
- 有人手动或用脚本修改购物车里的配送日期。
Shopify 自带的免费办法,即用主题代码在购物车页添加日期选择器,同样有这个缺口:它能收集日期,但结账时没有任何东西检查它。
配送日期校验应该运行哪些检查
下面是 OrderRules 在结账时运行的检查,以及顾客默认看到的消息:
| 检查 | 能拦住什么 | 默认消息 |
|---|---|---|
| 日期必填 | 完全没有日期,常见于 Buy it now 或 Shop Pay | 结账前请选择配送日期。 |
| 日期可用 | 过去的日期、备货期内或截单之后的日期、不配送的星期、超出可预订范围的日期 | 该配送日期已不可用,请另选一个。 |
| 已关闭日期 | 封锁日期,例如节假日 | 所选日期不提供配送,请另选一个。 |
| 当天已满 | 该日期已达到「每个配送日期的最大订单数」 | {date}的配送已约满,请另选日期。 |
| 时间段 | 没有选择时间段,或该时间段已满 | 请选择配送时间段。/ 该配送时间段已满,请另选一个。 |
| 按日期的商品上限 | 商品数量超过该日期的剩余量 | Only {n} left for delivery on {date}. Please reduce the quantity or choose another date. |
| 履约方式 | 仅自提和仅配送的商品混在一起,或方式不对 | 您购物车中的部分商品需要不同的发货方式,无法一起购买。 |
| 自提 | 没有自提日期、自提点或时间;自提日或时间段已关闭或已满 | 结账前请选择自提日期。(另有五条) |
如果某款应用的结账检查只覆盖第一行,它能拦住没有日期的订单,却拦不住超订的订单。
在 Shopify 上实现校验的三种方式
1. 自己开发校验 Function。 开发者编写一个购物车与结账校验 Function,读取购物车里的配送日期,日期不被允许就返回错误。它适用于所有套餐。Function 运行时无法查询数据库,所以你的可用日期和已预订数量必须事先写入 metafield 并保持更新。这是大部分工作量所在。Shopify 的校验 Function 详解介绍了其中的机制。
2. 使用带结账校验的配送日期选择器应用。 安装前先问五个问题:
- 它用的是购物车与结账校验 Function,还是只有主题 JavaScript?
- 它能拦住没有日期的 Buy it now、Shop Pay 和 Apple Pay 订单吗?
- 这项检查在哪些 Shopify 套餐上运行?
- 它会在结账时重新检查已满的日期和时间段,还是只在选择器里把它们隐藏?
- 你能用自己销售的每一种语言编辑消息吗?
我们的配送日期选择器应用对比标明了哪些应用在结账时强制执行,哪些只做展示。
3. 在 Shopify Plus 上,把选择器放进结账页。 结账 UI 扩展会在结账页上显示日历,所以快捷支付的买家也能看到。但它仍然只是展示:请与校验 Function 搭配使用,否则日期可能被跳过或已过期。
在 OrderRules 中设置
- 在 Advanced 套餐中,打开你的可用性规则,开启结账时必须选择配送日期(如果使用时间段,也开启必须选择时间段)。
- 在 Shopify 中打开设置 → 结账,滚动到结账规则,确认 OrderRules 规则已开启。
- 设置校验要检查的内容:每个配送日期的最大订单数、每个时间段的每日上限、按配送日期统计的商品限制,以及封锁日期。
- 在结账消息中,编辑任意消息或应用语言包。
- 分别不选日期、选已关闭的日期和选已满的日期,通过购物车、Buy it now 和 Shop Pay 测试。开发店铺是最稳妥的试验场所。
校验检查不到的情况
- 两笔结账在同一秒内抢最后一个名额,可能都会通过。校验读取的是已预订量,不会加锁。
- 截单时间刚过后,在应用刷新允许日期列表之前的短时间内,某个日期仍可能通过结账。页面上的选择器会立即移除该日期。
- 绕过结账的订单不会被检查:Shopify POS、订阅续订、在后台创建并标记为已付款的订单,以及来自其他应用或 Admin API 的订单。它们仍会计入你的上限。
- 购买后的修改。 在 Shopify 后台更改订单的日期不会被检查,也不会改变它占用的名额。
- 邮编和区域。 OrderRules 不检查地址。想停止向某个区域配送,请把它从 Shopify 的配送区域中去掉。
更多内容见兼容性与已知限制。