MultiDrop Scheduler for WooCommerce
A comprehensive WooCommerce plugin for managing pickup locations with advanced scheduling
by Alessandro Imbrenda · github.com/aimbrenda/woocommerce-pickup-manager · website
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/aimbrenda/woocommerce-pickup-manager/archive/refs/heads/main.zipA comprehensive WordPress plugin that adds pickup location functionality to WooCommerce, allowing customers to select pickup locations and dates during checkout with advanced scheduling options.
✨ Features
Core Functionality
- 🗺️ Multiple Pickup Locations - Unlimited locations with individual settings
- 📅 Date Picker Integration - Interactive calendar with availability control
- ⏰ Flexible Scheduling - Weekly schedules with date-specific overrides
- 💰 Location-Specific Fees - Different pickup fees per location
- 🔗 Map Integration - Google Maps/Apple Maps links for each location
- 📧 Order Integration - Pickup info in orders, emails, and admin
Advanced Features
- ⏱️ Minimum Preparation Time - Set minimum hours before pickup is available
- 📆 Maximum Advance Booking - Limit how far ahead customers can book
- 🔄 Weekly Schedules - Configure which days each location is open
- 📋 Date Overrides - Override weekly schedule for holidays/special days
- 🎛️ Global Enable/Disable - Master switch to control pickup system
- 📍 Flexible Position - Choose where pickup fields appear on checkout
- 💾 Import/Export - Backup and migrate location configurations
- 🌐 Translation Ready - Full i18n support
🚀 Installation
- Download the latest release from Releases
- Upload the plugin
- Activate the plugin through WordPress admin
- Navigate to Pickup Locations in the admin menu
Requirements
- WordPress 5.8 or higher
- WooCommerce 6.0 or higher
- PHP 7.4 or higher
- MySQL 5.6 or higher
📖 Usage
Quick Start
-
Enable Pickup System
- Go to Pickup Locations → Settings
- Check "Enable pickup location selection"
- Save settings
-
Add Your First Location
- Go to Pickup Locations → Add New
- Fill in location details:
- Name (e.g., "Amsterdam Central Store")
- Address
- Map Link (optional - Google Maps URL)
- Pickup Fee (0 for free)
- Min Delay: 24 hours (customers can't pickup same day)
- Max Advance: 14 days (customers can book up to 2 weeks ahead)
- Select weekly availability (e.g., Mon-Fri)
- Check "Active"
- Save
-
Test on Checkout
- Add a product to cart
- Go to checkout
- Select your pickup location
- Choose a pickup date
Configuration Examples
Example 1: Basic Store Pickup
Name: Main Store
Address: 123 Main Street, City
Pickup Fee: €0.00
Min Delay: 24 hours
Max Advance: 30 days
Weekly: [✓] Mon [✓] Tue [✓] Wed [✓] Thu [✓] Fri
Active: [✓]
Example 2: Express Pickup Point
Name: Express Pickup (Premium)
Address: 456 Quick Street, City
Pickup Fee: €5.00
Min Delay: 2 hours
Max Advance: 7 days
Weekly: [✓] Mon-Sun (all days)
Active: [✓]
Example 3: Warehouse (Appointment Only)
Name: Warehouse Pickup
Address: 789 Industrial Ave, City
Pickup Fee: €0.00
Min Delay: 48 hours
Max Advance: 90 days
Weekly: [✓] Mon [✓] Wed [✓] Fri
Date Overrides:
- Dec 25: CLOSED (Christmas)
- Dec 31: CLOSED (New Year's Eve)
Active: [✓]
Date Overrides
Use date overrides to handle holidays and special circumstances:
- Close on a normally open day: Uncheck "Open for pickup"
- Open on a normally closed day: Check "Open for pickup"
- Add a note: e.g., "Christmas Holiday", "Special Opening"
Map Links
Supported map services:
- Google Maps:
https://maps.google.com/?q=Your+Address - Apple Maps:
https://maps.apple.com/?q=Your+Address - OpenStreetMap:
https://www.openstreetmap.org/?q=Your+Address
Import/Export
Export locations:
- Go to Pickup Locations → Import/Export
- Click "Export All Locations"
- Save the JSON file
Import locations:
- Go to Pickup Locations → Import/Export
- Choose your JSON file
- Select import mode:
- Add to existing: Keeps current locations
- Replace all: Deletes current and imports new
- Click "Import Locations"
🛠️ Development
File Structure
woocommerce-pickup-manager/
├── woocommerce-pickup-manager.php # Main plugin file
├── uninstall.php # Cleanup on uninstall
├── includes/
│ ├── class-database.php # Database operations
│ ├── class-admin.php # Admin interface
│ ├── class-checkout.php # Frontend checkout
│ └── class-import-export.php # Import/export functionality
├── templates/
│ └── admin/
│ ├── locations-list.php # Location list table
│ ├── location-form.php # Add/edit form
│ ├── import-export.php # Import/export UI
│ └── settings.php # Settings page
├── assets/
│ ├── css/
│ │ ├── admin.css # Admin styles
│ │ └── checkout.css # Frontend styles
│ └── js/
│ ├── admin.js # Admin scripts
│ └── checkout.js # Flatpickr integration
├── languages/ # Translation files
├── README.md
├── CONTRIBUTING.md
└── LICENSE
Database Schema
Table: wp_pickup_locations
CREATE TABLE wp_pickup_locations (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
address text NOT NULL,
map_link text,
pickup_fee decimal(10,2) DEFAULT 0,
min_delay_hours int DEFAULT 24,
max_advance_days int DEFAULT 30,
weekly_schedule text NOT NULL,
is_active tinyint(1) DEFAULT 1,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
Table: wp_pickup_date_overrides
CREATE TABLE wp_pickup_date_overrides (
id mediumint(9) NOT NULL AUTO_INCREMENT,
location_id mediumint(9) NOT NULL,
override_date date NOT NULL,
is_open tinyint(1) DEFAULT 0,
note varchar(255),
PRIMARY KEY (id),
KEY location_id (location_id),
KEY override_date (override_date)
);
Hooks & Filters
Actions
wc_multidrop_scheduler_location_saved- After location is savedwc_multidrop_scheduler_location_deleted- After location is deletedwc_multidrop_scheduler_override_added- After date override is added
Filters
wc_multidrop_scheduler_available_dates- Modify available dateswc_multidrop_scheduler_location_fee- Modify location feewc_multidrop_scheduler_checkout_position- Change default position
Example:
// Change default checkout position
add_filter('wc_multidrop_scheduler_checkout_position', function($position) {
return 'before_customer_details';
});
// Modify location fee dynamically
add_filter('wc_multidrop_scheduler_location_fee', function($fee, $location_id) {
// Add 10% on weekends
if (date('N') >= 6) {
return $fee * 1.10;
}
return $fee;
}, 10, 2);
🌍 Translation
The plugin is translation-ready and uses WordPress i18n functions.
Text Domain: multidrop-scheduler-for-woocommerce
To translate:
- Use Poedit or Loco Translate
- Create
.poand.mofiles - Place in
/languages/directory
Translations needed:
- Spanish (es_ES)
- French (fr_FR)
- German (de_DE)
- Italian (it_IT)
- Dutch (nl_NL)
🧪 Testing
Manual Testing Checklist
- [ ] Add/edit/delete locations
- [ ] Enable/disable locations individually
- [ ] Enable/disable pickup system globally
- [ ] Select location at checkout
- [ ] Date picker shows correct available dates
- [ ] Pickup fee added to cart correctly
- [ ] Order shows pickup info in admin
- [ ] Order emails include pickup details
- [ ] Map links work correctly
- [ ] Date overrides work
- [ ] Import/export functionality
- [ ] Position setting works
Browser Testing
- Chrome/Edge (latest)
- Firefox (latest)
- Safari (latest)
- Mobile browsers
🤝 Contributing
We welcome contributions! Please see CONTRIBUTING.md for details.
Quick Contribution Guide
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
📄 License
This plugin is licensed under the GPL-3.0 License - see the LICENSE file for details.
🙏 Acknowledgments
- Flatpickr - Date picker library
- WooCommerce - E-commerce platform
- All contributors who have helped improve this plugin
💬 Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: Wiki
🎯 Roadmap
Planned Features
📊 Stats
Made with ❤️ for the WordPress community