---
title: "Shopify 配送日期校验：在结账时拦截缺失、已关闭和已满的日期"
description: "配送日期选择器只负责展示日期。校验才能拦住没有日期、日期已关闭或已满的订单。这里是真正重要的检查项、顾客看到的确切提示、在 Shopify 上实现的三种方式，以及它仍然检查不到的情况。"
contentType: "blog"
locale: "zh"
localized: true
source: "https://orderrules.com/zh/blog/shopify-delivery-date-validation"
slug: "shopify-delivery-date-validation"
date: "2026-10-31"
tags:
  - "shopify"
  - "delivery dates"
  - "delivery date validation"
  - "checkout validation"
  - "shopify functions"
  - "express checkout"
  - "buy it now"
  - "shop pay"
  - "capacity"
---
**配送日期选择器负责展示日期，校验负责执行日期。** 在 Shopify 上，校验指的是购物车与结账校验 Function：它在付款前于 Shopify 服务器上运行，一旦日期缺失、已关闭或已满，就拦下订单。它适用于所有 Shopify 套餐，也覆盖每一种进入结账的方式，包括 Shop Pay、Apple Pay 和 **Buy it now**。只有在结账页面*内部*显示选择器才需要 Plus。

## 为什么只有选择器会放过错误日期

商品页或购物车页上的选择器只是展示。它在顾客的浏览器里把已关闭和已满的日期置灰，仅此而已。出现下面这些情况时，没有有效日期的订单仍会通过：

- **顾客使用快捷按钮。** 商品页上的 Buy it now、Shop Pay、Apple Pay 和 Google Pay 直接进入结账，所以购物车选择器根本不会运行。参见 [Buy It Now 会跳过配送日期](/blog/shopify-buy-it-now-skips-delivery-date)。
- **付款期间日期被订满了。** 页面加载时选择器显示「还剩 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 详解](/blog/shopify-checkout-validation-functions-block-orders)介绍了其中的机制。

**2. 使用带结账校验的配送日期选择器应用。** 安装前先问五个问题：

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

我们的[配送日期选择器应用对比](/blog/best-shopify-delivery-date-picker-apps)标明了哪些应用在结账时强制执行，哪些只做展示。

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

## 在 OrderRules 中设置

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

## 校验检查不到的情况

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

更多内容见[兼容性与已知限制](/docs/guides/compatibility-and-limitations)。

## 相关阅读

- [Buy It Now 会跳过配送日期](/blog/shopify-buy-it-now-skips-delivery-date) · [结账校验的工作原理](/blog/shopify-checkout-validation-functions-block-orders) · [最佳配送日期选择器应用](/blog/best-shopify-delivery-date-picker-apps)
- [结账时的配送日期（Plus）](/docs/delivery/delivery-date-at-checkout) · [配送日期限制](/docs/delivery/delivery-date-limits)
