Block Delivery Dates in WooCommerce
Set blackout delivery dates in WooCommerce: holidays, closures and carrier blackouts, recurring weekday rules, and per-product date restrictions.

Every delivery calendar needs a list of days that must not be selectable. Christmas Day is the obvious one. Less obvious are your own stocktake week, the Friday the whole team is at a supplier event, and the carrier blackout days that appear in late November when the network runs at capacity. If those dates are pickable, customers will pick them — and each one becomes a phone call.
Four categories of blocked date
Keeping them separate makes the list maintainable:
- Recurring weekdays. Sundays, and often Mondays when there is no Sunday dispatch. Express these as a weekday rule, never as individual dates.
- Public holidays. Fixed per country and worth entering a full year ahead. Moving holidays like Easter need re-entry annually.
- Company closures. Stocktake, team days, refits, the week between Christmas and New Year.
- Carrier blackouts. Peak-season days when your carrier refuses new bookings, plus their own holiday schedule, which frequently differs from yours.
Recurring rules beat date lists
A store that blocks Sundays by adding 52 dates every January will eventually forget. A weekday rule ("never Sunday") holds indefinitely and survives the person who set it up leaving. Use explicit dates only for the exceptions that genuinely are exceptions.
Same logic for holidays: if your plugin or code supports a country holiday set, use it and add only your local extras on top.
Enforce the list twice
A blocked date greyed out in the calendar is a hint, not a guarantee. Validate the submitted date again on the server:
```php add_action( 'woocommerce_checkout_process', function () { $date = isset( $_POST['delivery_date'] ) ? sanitize_text_field( wp_unslash( $_POST['delivery_date'] ) ) : '';
if ( $date === '' ) { return; }
if ( store_is_blocked_delivery_date( $date ) ) { wc_add_notice( __( 'We cannot deliver on that date. Please choose another.', 'your-textdomain' ), 'error' ); } } ); ```
Client-side only enforcement fails in three ordinary ways: a cached checkout page from before you added a date, a modified request, and a customer who left the tab open across midnight so "tomorrow" is no longer what it was.
Per-product blocked dates
Some restrictions belong to the product rather than to the store. Fresh produce cut off before a holiday weekend, made-to-order furniture with a fixed production calendar, installations that need a fitter. Those products carry their own unavailable days.
In a mixed cart, apply strictest-wins: a date is selectable only if every item in the cart can make it. Anything more permissive promises a date that one of the products cannot hit, which is exactly the failure the calendar was supposed to prevent.
Doing it as configuration
Our Delivery Date & Timeslot for WooCommerce plugin holds all four categories as settings — weekday rules, individual blocked dates, per-product restrictions and lead times — and enforces them in the picker and again at checkout. The practical benefit is not the code you avoid writing; it is that a shop manager can block next Tuesday at 9am on the morning the van breaks down.
Blocked dates work alongside two other rules worth reading: the cut-off time that removes today after your dispatch deadline, and slot capacity that stops the remaining days filling beyond what the route can carry.
An annual maintenance habit
Put a recurring reminder in November: add next year's public holidays, confirm the Christmas closure dates, and ask your carrier for their peak blackout list. Ten minutes a year prevents the single most common delivery-date failure, which is a January order accepted for a day the store is shut.
Also check the list after any change of carrier. Their blackout calendar rarely matches the previous one, and the old dates linger silently until a customer finds them.
FAQ
- How do I block specific delivery dates in WooCommerce?
- Keep a list of blocked dates and disable them in the checkout date picker, then re-validate the submitted date on the server. Recurring closures are better expressed as weekday rules than as hundreds of individual dates.
- What dates should a store block?
- Public holidays, your own closures such as stocktake or staff days, carrier blackout days around peak season, and any weekday you never deliver. Add the following year's holidays before December.
- Can I block dates for one product only?
- Yes. Products with their own constraints — fresh goods, made-to-order items, installations — can carry their own blocked days, and the checkout should apply the strictest combination in a mixed cart.
- How do I handle a cart where two products have different blocked dates?
- Use strictest-wins: a date must be available for every item in the cart to be selectable. It is the only rule that never promises a date one of the products cannot make.
- Why do blocked dates still appear at checkout?
- Usually a caching layer serving an old calendar, or a rule applied only in JavaScript. Exclude the checkout from page caching and enforce the same list server-side during checkout validation.
This article is part of our WooCommerce delivery dates topic hub, where the related plugins and guides live together.


