Skip to content

Configuration

All of Pickup’s settings live on one screen, WooCommerce → Pickup, and are stored in a single option, pickup_settings. The form has three cards: General (the toggle and four booking rules), Weekly opening hours, and Pickup locations. Saving is nonce-checked and gated to the manage_woocommerce capability; every number is clamped to a safe minimum, and times outside HH:MM are discarded.

Pickup rides on top of WooCommerce Local Pickup, so enable that shipping method first under WooCommerce → Settings → Shipping.

The master switch (enabled), on by default. When off, your locations and hours stay saved but no pickup fields are shown at checkout and the checkout hooks are not registered at all, the storefront is untouched. Turn it back on to resume without re-entering anything.

slot_minutes, how far apart pickup times are offered. Default 30, clamped to a minimum of 5. A 09:00-17:00 day at 30 minutes gives 09:00, 09:30, 10:00 and so on. A longer length means fewer, wider slots.

capacity, how many orders may book the same location + date + slot before it is treated as full and dropped from the list. Default 5, minimum 1. The count includes orders in the pending, processing, on-hold and completed states (see How scheduling works).

lead_hours, the minimum notice before the earliest bookable slot, so staff have time to prepare. Default 2, minimum 0. With a lead time of 2, any slot less than two hours from now is hidden.

horizon_days, how far ahead customers may book. Default 14, minimum 1. The date field’s max is set to today plus this many days, and the schedule is generated only within that range.

One start and end time per weekday (Monday-Sunday), entered as 24-hour HH:MM in native <input type="time"> fields. Leave a day’s fields blank to close it, the default schedule opens Mon-Fri 09:00-17:00 and closes the weekend.

On save, a day is kept only when both times are valid HH:MM and the end is later than the start; anything else is dropped, so a half-filled or reversed window simply closes that day. The schedule is store-wide: the same weekly hours apply to every location, Pickup has no per-location hours.

Note: the admin screen exposes a single window per day. The stored shape (windows, keyed by ISO weekday 1-7) can hold a list of windows per day, but the UI reads and writes only the first one.

Each location has a Name and an optional Address (shown after the name in the checkout dropdown, e.g. Downtown store, 12 High St), plus an Enabled checkbox. Use Add location to add rows and Remove to drop them.

  • A row with a blank Name is discarded on save.
  • The location id is derived from the name with sanitize_title(), and duplicate names get a -2, -3 suffix so ids stay unique and stable.
  • Disabled locations are kept but never shown at checkout. You need at least one enabled location for the fields to appear; with none, the checkout shows a “no pickup locations are configured yet” notice instead of broken controls.

Renaming or removing a location does not rewrite past orders: the chosen location’s name is snapshotted onto each order at checkout (_pickup_location_name), so historic orders stay readable.

Slots are generated in your store timezone (wp_timezone()), and the date is displayed using your WordPress Date format setting. There is nothing to configure here, Pickup follows your existing WordPress settings. The stored date is kept as Y-m-d and the slot as HH:MM; only the display is reformatted.

  • The fields appear only when the chosen shipping method is Local Pickup (method id starting local_pickup or pickup_location).
  • Once Local Pickup is chosen and a location exists, location, date and time are all required, there is no “location only” mode.
  • The selection is re-validated on the server before the order is created, regardless of JavaScript.

Settings live in the single pickup_settings option (autoload off). Per-order choices are stored as order meta: _pickup_location, _pickup_location_name, _pickup_date and _pickup_slot. Pickup creates no custom table and calls no external service.

Deleting the plugin runs uninstall.php, which removes the pickup_settings option. Per-order pickup meta is intentionally left in place, it is order history needed for fulfilment and accounting records.