Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/manujrs/appointments-lite/archive/refs/heads/master.zipNo built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.
📅 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+