AumReserva 把一个 WordPress 站点变成预约系统,适用于一切「一个人、一个时间」的预约: 课程、理疗、咨询、看房、维修。它不要求特定主题,也不需要其它插件。
1. 插件添加了什么
启用 AumReserva 会注册两个内容类型和两个分类法:
| 注册的东西 | 装什么 |
|---|---|
服务(arb_service) | 可被预约的内容:时长、价格、缓冲时间,以及由谁提供 |
| 服务分类 | 服务上的分类法,用来给目录分组 |
员工(arb_staff) | 由谁提供:职位、工作时间、休息日、状态 |
| 地点 | 员工上的分类法,按工作地点给他们分组 |
预约本身不是文章。它们是独立数据表 arb_bookings 里的行 —— 所以它们有状态、有 CSV 导出、有日历,而没有编辑器页面。
前台是一个短代码加一个弹窗。访客选服务、选员工、选日期、选一个空闲的开始时间,然后 留下联系方式。预约写进表里,配置好的邮件随即发出。
2. 安装
安装并启用插件。后台出现 Reserva 菜单,下有七个页面:仪表盘、服务分类、全部服务、 全部员工、地点、全部预约、设置。

有两件事建议先做,因为预约表单会读取它们:
- Reserva → 全部服务 —— 至少添加一个服务。
- Reserva → 全部员工 —— 至少添加一位员工,然后在服务的指派员工里选上他。
没有指派任何员工的服务无法被预约。弹窗会停在选员工那一步,并且找不到人可选。
3. 服务
服务是一篇普通文章,外加一个服务详情面板。


| 字段 | 控制什么 |
|---|---|
| 时长(分钟) | 这次预约持续多久 |
| 价格 | 显示在服务卡片、弹窗和邮件里 |
| 服务后缓冲时间(分钟) | 预约结束后额外占用的分钟数,用于清理、记录或路途 |
| 指派员工 | 谁能提供这个服务。访客在第一步从这些人里选 |
| 每个时段最多预约数 | 覆盖站点级的数值。留空则跟随全局设置 |
| 定金(%) | 覆盖站点级的定金比例。需要 WooCommerce |
| 选员工这一步 | 跟随全局设置、对这个服务强制开启、或强制关闭 |
占用时段时,时长和缓冲是加在一起算的。一个 45 分钟的服务配 10 分钟缓冲,占用 55 分钟 —— 同一个人的下一次预约最早只能在 55 分钟之后开始。
3.1 一次承载多人的服务
另外三个字段把一个服务从「一次预约」变成「一个班次或一堂课」:
| 字段 | 控制什么 |
|---|---|
| 固定开始时间 | 具体时间,例如 09:00, 13:30。留空则提供当天的每一个时段 |
| 每个时间的名额数 | 一个开始时间能承载多少人。留空表示每次预约算一组,不统计人数 |
| 每次预约的最多人数 | 一次预约最多可带几人。仅在设置了名额数时才生效 |
设置了名额之后,弹窗里每个开始时间都会带上剩余名额数,预约扣减的是它的人数,而不是 直接把这个时间关掉。
服务分类只用来给你自己分组,不限制谁能约什么。
4. 员工
员工也是一篇普通文章,外加两个面板。


员工详情装的是「他是谁」和「他什么时候上班」:
| 字段 | 控制什么 |
|---|---|
| 职位 | 显示在选员工那一步的姓名下方 |
| 从业年数 | 和职位一起显示 |
| 为该员工覆盖全局工作时间 | 勾选后,下面两个字段取代站点级的工作时间 |
| 上班时间 / 下班时间 | 这个人的工作日区间 |
| 休息日 | 这个人不可约的日期,不论工作时间如何 |
| 状态 | 在岗、休假中或停用。只有在岗的员工会被提供 |
自定义时间只会收窄可约范围,不会放宽。站点 09:00 开门而某位员工 10:00 才开始,那么从 10:00 起才提供他;09:00 和 09:30 两格会以「不可约」的样子留在弹窗里,而不是消失 —— 访客因此看得出这个时间存在,只是这个人不上班。
关联登录账号把这位员工连到一个 WordPress 用户:既可以关联已有账号,也可以用姓名、 邮箱地址和一封可选的欢迎邮件新建一个。关联过的员工登录后,无论在后台日历里还是通过 [arb_my_bookings],看到的都只有他自己的预约。
5. 地点
地点是员工上的分类法,不是服务上的。同一个服务可以在多个地方提供,因为提供它的人在多个 地方上班。

选员工那一步按地点分组显示,每个地点一个小标题。被指派到两个地点的员工会在两个标题下各 出现一次。访客选的是哪一条,会随预约一起记录下来。
6. 你什么时候营业
站点级的工作时间在 Reserva → 设置 → 常规的工作时间一节:
| 设置项 | 控制什么 |
|---|---|
| 工作日 | 一周里哪几天接受预约 |
| 工作时间 | 站点级的上下班时间 |
| 休息时间 | 每天一段不接受预约的时间 |
| 时段长度 | 提供的开始时间之间相隔多少分钟 |
| 最少提前小时数 | 预约在开始前多少小时关闭 |
| 最多提前天数 | 日历向后开放多少天 |
| 每个时段最多预约数 | 一个开始时间接受几次预约,除非某个服务覆盖了它 |
时段长度是开始时间之间的间隔,不是预约的长度。间隔 30 分钟时,一个 45 分钟的服务会在 10:00、10:30、11:00…… 被提供,而每次预约按它自己的时长加缓冲占用时间。
7. 把预约表单放到页面上
新建一个页面,加入短代码 [arb_services]。它会把每个已发布的服务渲染成一张卡片,带价格、 时长和立即预约按钮。

可用的短代码有三个:
| 短代码 | 渲染什么 |
|---|---|
[arb_services] | 服务卡片和预约弹窗 |
[arb_booking_button] | 单个服务的一个按钮,用在其它内容里 |
[arb_my_bookings] | 客户自己的预约,以及预约完成后立即显示的确认信息 |
Reserva → 设置 → 预约流程 → 跳转页面指定访客预约完之后落在哪里。指向放了 [arb_my_bookings] 的那个页面,他就会看到刚约的内容;留空则让他停在下单的那个页面上。
8. 访客做的事
第一步 —— 选员工。 指派给这个服务的人,按地点分组。这一步可以在站点级关掉,也可以 在单个服务的选员工这一步里关掉。

第二步 —— 选日期。 不在工作日之内的、早于最少提前量的、超出最多提前天数的,以及这个 人的休息日,都显示为不可约。

第三步 —— 选时间。 按配置的间隔给出开始时间。一个时间在下列情况下不可约:落在这个人 的工作时间之外、落在休息时间里,或者被已有预约的时长加缓冲盖住。

第四步 —— 填写信息。 姓名和邮箱必填,电话和备注可选。字段上方的摘要会重复日期、时间 和员工。开启收集地址后会增加一个必填的地址字段。

访客是否需要账号,由预约流程里的允许访客预约和要求登录决定。允许访客预约时不会创建 账号,预约按邮箱地址归属。
9. 后台里的预约
Reserva → 全部预约列出每一条预约。

筛选条可按状态、员工、服务和日期区间收窄。CSV 导出的是当前筛选的结果,不是整张表。
状态是行上的一个下拉框,所以改状态只要一个动作,不需要单独的页面。状态有五种:待确认、 已确认、已取消、已完成和未到。新预约落在哪一种,由预约流程里的 自动确认预约决定:关掉它,预约就以待确认的状态进来等你处理。
10. 日历
Reserva → 仪表盘上有四个计数、最近的预约,和一个日历。

日历每位员工一列,最前面还有一列未指派,装没有指定员工的预约。日和周切换跨度, 员工下拉框把它收窄到一个人。
关联了登录账号的员工,只看得到他自己那一列。
11. 邮件
Reserva → 设置 → 通知决定谁会被告知什么:
| 通知 | 发给 | 什么时候 |
|---|---|---|
| 新预约 | 客户、员工 | 有人下单时 |
| 已确认 | 客户 | 预约转为已确认时 |
| 已取消 | 客户、员工 | 预约转为已取消时 |
| 提醒 | 客户、员工 | 预约开始前设定的小时数 |
每个收件人各是一个开关,而启用邮件是它们之上的总开关。管理员邮箱设定的是:当一条 预约没有指定员工时,那份本该发给员工的邮件发往哪里。
提醒由 WP-Cron 发送,所以它依赖站点有访问量,或者有一个真正的 cron 任务在调用 wp-cron.php。在没有访客的站点上,提醒会迟发或根本不发。
12. 给这三样东西改名
「服务」「员工」「地点」只是默认叫法。Reserva → 设置 → 常规 → 名称自定义可以改掉这三样 的单数和复数。

复数那几个标签同时也是服务归档页、员工页和地点页的网址基础。把服务改成理疗, 归档页就从 /services/ 变成 /treatments/。指向旧地址的链接会失效,所以改名要在对外发布 链接之前做,不要在之后。
改过的名称会出现在后台菜单、面包屑、归档页标题,以及预约弹窗的每一步里。
13. 设置项逐项
设置页有三个标签。
13.1 常规
| 设置项 | 作用 |
|---|---|
| 名称自定义 | 第 12 节说的那六个标签 |
| 货币符号 | 加在插件渲染的每个价格前面 |
| 时间格式 | 12 小时制或 24 小时制,作用于插件渲染的每一个时间,邮件也算 |
| 工作日 | 一周里哪几天接受预约 |
| 工作时间 | 站点级的上下班时间 |
| 休息时间 | 每天一段不接受预约的时间 |
| 时段长度 | 提供的开始时间之间的间隔 |
| 每个时段最多预约数 | 一个开始时间接受几次预约,除非某个服务覆盖了它 |
| 最少提前小时数 | 在预约开始前这么多小时关闭预约 |
| 最多提前天数 | 日历向后开放这么多天 |
| 定金(%) | 站点级的定金,在预约时收取。需要 WooCommerce |
13.2 预约流程
| 设置项 | 作用 |
|---|---|
| 选员工这一步 | 站点级地决定弹窗要不要问员工 |
| 允许访客预约 | 不注册账号能不能预约 |
| 要求登录 | 要不要有账号才能打开表单 |
| 自动确认预约 | 新预约进来是已确认还是待确认 |
| 允许客户取消 | 客户自己的预约上要不要出现取消按钮 |
| 取消截止(小时) | 在预约开始前多少小时关闭取消 |
| 收集地址 | 增加一个必填的地址字段,用于上门服务 |
| 跳转页面 | 访客预约完落在哪里 |
13.3 通知
| 设置项 | 作用 |
|---|---|
| 启用邮件 | 所有通知之上的总开关 |
| 管理员邮箱 | 预约没有指定员工时,那份员工邮件发往哪里 |
| 通知客户:新建、已确认、已取消 | 发给客户的每条消息各一个开关 |
| 通知员工:新建、已取消 | 发给员工的每条消息各一个开关 |
| 提醒小时数 | 在预约开始前多少小时发出提醒 |
| 提醒的收件人 | 提醒发给客户、员工,还是两者都发 |
14. 疑难排查
弹窗打开了,但一个人都没有。 这个服务没有指派任何员工。指派员工是服务上的字段, 不是员工上的。状态为休假中或停用的员工同样不会被提供。
日历里每一天都不可约。 先查工作日,再查这位员工的自定义时间,再查最少提前量。最少提前 量大于最多提前天数时,一天可约的日子都不会剩下。
白天中间缺了一些时段。 休息时间不接受预约;另外,一个开始时间如果加上时长和缓冲会越过 下班时间,它也不会被提供。
时间的格式不对。 常规里的时间格式作用于插件渲染的每一个时间,邮件也算在内。
提醒收不到。 提醒跑在 WP-Cron 上。确认 wp-cron.php 确实在被调用 —— 要么靠站点访问量, 要么靠一个真正的 cron 任务。
访客预约完看到的是一堵登录墙。 1.5.5 已修。在那之前,跳转地址带着预约编号而没有任何 一端读它。1.5.5 起,跳转页面会显示刚刚下的那条预约。
本教程里的截图由本目录下的规格重新生成,对应的插件版本记录在 `img/shot-meta.json` 里。