Appointments Lite (Calendar + Woo Checkout)
A lightweight WordPress plugin that provides an expandable booking calendar integrated with WooCommerce for paid appointment reservations.
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/manujrs/appointments-lite-plugin/archive/refs/heads/main.zip📅 Appointments Lite – Calendar + WooCommerce Integration
A lightweight WordPress plugin that provides an expandable booking calendar integrated with WooCommerce for paid appointment reservations.
Built to work with:
- Hello Elementor
- Elementor (free version)
- WooCommerce
✨ Features
- 📆 Monthly booking calendar
- 🔽 Collapsible / expandable UI
- ⏳ Configurable working hours
- 🕒 Configurable slot duration
- 🔐 Prevents double booking
- 💳 WooCommerce checkout integration
- 🔒 Automatically blocks confirmed appointments
- ♻️ Automatic expiration for unpaid reservations
- 🎯 Clean UI/UX with disabled occupied slots
🏗 How It Works
- User selects a date and time.
- Plugin creates a pending appointment.
- User is redirected to WooCommerce checkout.
- After payment confirmation:
- Appointment status changes to
confirmed - Time slot becomes unavailable in the calendar.
- Appointment status changes to
⚙️ Requirements
- WordPress 6.0+
- PHP 8.0+
- WooCommerce (active)
- Elementor (optional, only for UI placement)
🚀 Installation
- Clone or download this repository.
- Upload the plugin folder to:
- Activate Appointments Lite from WordPress admin.
- Make sure WooCommerce is active.
- Configure plugin settings:
🧩 Usage
Add the calendar anywhere using the shortcode:
In Elementor (free version):
- Add a Shortcode widget
- Paste
[apl_calendar]
🔧 Settings
Go to: You can configure:
- Working days
- Working hours
- Slot duration
- Hold time for unpaid reservations
- WooCommerce product ID (auto-created if empty)
🔁 Appointment Status Flow
| Status | Description |
|---|---|
| pending | Reserved but unpaid |
| confirmed | Paid and locked |
| cancelled | Cancelled order |
| expired | Hold time exceeded |
🛡 Double Booking Protection
Slots are blocked based on:
start_localstatus = pending OR confirmed
Blocked slots are displayed in the UI as: ocupado
and cannot be selected.
🕓 Automatic Expiration
Unpaid appointments expire automatically after the configured hold time.
Handled via WP-Cron.
🧪 Testing
- Activate WooCommerce.
- Enable Cash on Delivery (for quick testing).
- Book a slot.
- Complete checkout.
- Verify:
- Appointment is confirmed.
- Slot appears disabled in calendar.
🧠 Technical Notes
- Slot uniqueness is based on canonical UTC ISO format.
- Timezone is derived from WordPress settings.
- UI blocks slots using
start_localfor robustness. - AJAX endpoints use nonce verification.
- Cart is limited to one appointment at a time.
📌 Future Improvements (Roadmap)
- Multiple services with different durations/prices
- Admin calendar overview
- Email notifications
- Google Calendar sync
- REST API endpoints
- Custom database table for high-scale usage
👨💻 Author
Manuel Rejón
Frontend Developer | WordPress | Vue | TypeScript
📜 License
GPL-2.0+