跳至主要内容
技术

Shopify 配送日期校验:在结账时拦截缺失、已关闭和已满的日期

Jahangir Alam2026年10月31日事实核查于 2026年10月31日9 min read

配送日期选择器负责展示日期,校验负责执行日期。 在 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. 使用带结账校验的配送日期选择器应用。 安装前先问五个问题:

  1. 它用的是购物车与结账校验 Function,还是只有主题 JavaScript?
  2. 它能拦住没有日期的 Buy it now、Shop Pay 和 Apple Pay 订单吗?
  3. 这项检查在哪些 Shopify 套餐上运行?
  4. 它会在结账时重新检查已满的日期和时间段,还是只在选择器里把它们隐藏?
  5. 你能用自己销售的每一种语言编辑消息吗?

我们的配送日期选择器应用对比标明了哪些应用在结账时强制执行,哪些只做展示。

3. 在 Shopify Plus 上,把选择器放进结账页。 结账 UI 扩展会在结账页上显示日历,所以快捷支付的买家也能看到。但它仍然只是展示:请与校验 Function 搭配使用,否则日期可能被跳过或已过期。

在 OrderRules 中设置

  1. 在 Advanced 套餐中,打开你的可用性规则,开启结账时必须选择配送日期(如果使用时间段,也开启必须选择时间段)。
  2. 在 Shopify 中打开设置 → 结账,滚动到结账规则,确认 OrderRules 规则已开启。
  3. 设置校验要检查的内容:每个配送日期的最大订单数、每个时间段的每日上限、按配送日期统计的商品限制,以及封锁日期。
  4. 在结账消息中,编辑任意消息或应用语言包。
  5. 分别不选日期、选已关闭的日期和选已满的日期,通过购物车、Buy it now 和 Shop Pay 测试。开发店铺是最稳妥的试验场所。

校验检查不到的情况

  • 两笔结账在同一秒内抢最后一个名额,可能都会通过。校验读取的是已预订量,不会加锁。
  • 截单时间刚过后,在应用刷新允许日期列表之前的短时间内,某个日期仍可能通过结账。页面上的选择器会立即移除该日期。
  • 绕过结账的订单不会被检查:Shopify POS、订阅续订、在后台创建并标记为已付款的订单,以及来自其他应用或 Admin API 的订单。它们仍会计入你的上限。
  • 购买后的修改。 在 Shopify 后台更改订单的日期不会被检查,也不会改变它占用的名额。
  • 邮编和区域。 OrderRules 不检查地址。想停止向某个区域配送,请把它从 Shopify 的配送区域中去掉。

更多内容见兼容性与已知限制。

相关阅读

常见问题

可以。校验运行在 Shopify 购物车与结账校验 Function 中,公开应用可在所有套餐上使用,包括 Basic。只有在结账页面本身显示日期选择器才需要 Shopify Plus。

可以。这些按钮会跳过购物车,所以购物车页上的选择器根本看不到它们,但校验 Function 会在每一次结账时运行。如果日期缺失、已关闭或已满,顾客会在付款前被拦下。

开启校验后不能。系统会按你的备货期、截单时间、配送星期、可预订范围和封锁日期检查日期。有一种例外:截单时间刚过后的短时间内,在应用刷新允许日期列表之前,某个日期仍可能通过。

结账时会出现一条消息,例如「Please choose a delivery date before checking out」,或「Delivery on 2026-12-23 is fully booked. Please choose another date.」在 OrderRules 中,你可以编辑每一条消息,或应用语言包。

几乎总能。校验读取的是已有的预订量,而不是加锁,所以两笔结账在同一秒内抢最后一个名额时,可能都会通过。请把上限当作可靠的限制,而不是保证。

不需要。结账时的检查在所有套餐上运行。Plus 只是多了在结账页面内显示日期选择器的选项;没有 Plus 时,选择器放在商品页或购物车页,结账时仍会检查日期。

正在挑选应用?

查看 OrderRules 与该类别中其他所有 Shopify 应用的对比。

准备好掌控你的订单了吗?

免费试用 OrderRules