May 8, 2026 · 4 min read
Why I Shipped a Pickup Plugin to WordPress.org
A weekend of trying every existing pickup plugin convinced me to write my own. RestoPick is the result — pickup date and time at WooCommerce checkout, ASAP mode, honest hours that don't drift twice a year.
Plugin: RestoPick — Restaurant Pickup for WooCommerce on WordPress.org
This one started with a single restaurant client. The brief was small: customers should pick a date and time at WooCommerce checkout, the order should show up like any other order, and the kitchen should see the pickup window without hunting for it.
I spent a weekend trying every pickup plugin I could find. Some were paid-only, some assumed you also wanted delivery, some hard-coded American date formats. None of them got out of the way. So I wrote my own, and after the client launched I cleaned it up and pushed it to the WordPress.org repository. RestoPick is what came out the other side.
What happens at checkout
At checkout, two extra fields appear: Pickup date and Pickup time. The calendar only shows days the restaurant is open. Closed days are unselectable. Holidays are visually marked and disabled. The time dropdown is filtered to slots that fit that day’s hours and respect a minimum lead time the restaurant configured — so a customer can’t order at 6:59 for a 7:00 pickup the kitchen can’t actually make.
If the restaurant turns on ASAP mode, customers also see an “order now, pick up as soon as possible” option. The ASAP card greys itself out when the kitchen is about to close — and it does this live, without reloading the page, because nothing makes me less trusting of a checkout than one that lies about availability:
var pageLoad = Date.now();
function asapTargetMinutes() {
var elapsed = Math.floor((Date.now() - pageLoad) / 60000);
return cfg.nowMinutes + elapsed + (cfg.leadTime || 0);
}
The server stamps “it’s X minutes past midnight” once at render. The page adds the wall-clock time elapsed since, and the result is the minute-of-day the order would actually be ready. When that crosses today’s closing time, the ASAP button disables itself and the form flips to “Schedule for later”.
The thing I deliberated longest about: timezones
Everything else was straightforward. Timezones weren’t.
WordPress lets you pick a named zone like Asia/Jakarta or America/New_York, which observes daylight saving. For an editorial site that’s exactly right. For a restaurant that opens at 8 am year-round, it’s wrong in a subtle way — twice a year the stated hours would silently shift by an hour, and someone would eventually show up at a locked door.
So RestoPick stores pickup hours as a fixed UTC offset (e.g. +07:00) and ignores DST entirely. The hours the owner types in are the hours the customer sees, 365 days a year. If the owner wants their internal admin to track local clock time across DST, they can flip the offset manually twice a year. But I’d rather make the default the boring, predictable choice.
Where the pickup info ends up
Once an order is placed, the date and time appear in four places:
- WooCommerce admin order page — with an “ASAP” badge if applicable.
- Orders list column — quick at-a-glance.
- Customer and admin emails — so the receipt the customer keeps already has it.
- Thank-you page — one more time after checkout, before they close the tab.
The principle is the same in every place: if the kitchen needs it, make it impossible to miss. If the customer needs it, make it impossible to forget.
What you don’t get in free
A Pro add-on layers on per-product time windows (breakfast items only 6–10 am), recurring closed days (“every Monday”), a shortcode to render the pickup form outside checkout, and a small REST API to flip pickup on or off remotely. That’s its own write-up. The free version stands on its own — it’s not a demo, it’s the version most restaurants actually need.