Appearance
Special Hours Field
Regular work hours repeat every week. Real businesses don't. The Special Hours (VT) field lets each listing override its hours for specific dates — closed on Christmas Day, open late for an event, a half day before a holiday — and when that date arrives it replaces the normal hours everywhere they appear.
Add it alongside Work Hours
Special Hours doesn't replace Voxel's Work Hours field, it overrides it. Add both to the post type: Work Hours for the weekly schedule, Special Hours for the exceptions.
Setup
Step 1: Enable the field
- Go to Voxel Toolkit → Post Fields
- Find Special Hours (VT) and toggle it on
- Select Save Changes
Step 2: Add it to a post type
- Go to Voxel → Post Types → (your type) → Fields
- Add the Special Hours (VT) field
- Give it any label and key you like — nothing else references the key
That's the whole setup. The Work Hours widget and every work-hours dynamic tag pick it up automatically.
Adding a special date
Each entry in the field is one date:
| Setting | Description |
|---|---|
| Date | The calendar date this applies to |
| Label | Optional name shown to visitors, e.g. "Christmas Day" |
| Availability | Closed all day, Open all day, Appointments only, or Enter hours |
| Repeats every year | Apply this date every year, or only the year entered |
| Hours | One or more open/close times, when Availability is set to Enter hours |
The availability options are deliberately the same four Voxel's Work Hours field uses, so a special date renders exactly like a normal day.
Repeating dates
Fixed holidays that land on the same date each year — Christmas Day, New Year's Day — should have Repeats every year switched on. Enter it once and it applies every year.
Moving holidays, or a one-off closure, should have it switched off, so the override applies only to the year entered.
A specific year always wins
If a date has both a recurring entry and an entry for that exact year, the exact date is used. So you can keep "Closed on 25 December, every year" and still override 2027 alone by adding a second entry for 2027-12-25.
What changes when a special date is today
The special date takes the place of that weekday everywhere:
- The Work Hours (VX) widget's today row and its weekly list
- The Open / Closed status badge
@post(work_hours.status)and@post(work_hours.status_label)@post(work_hours.today)and the individual weekday tags
No template changes, no second widget, nothing to re-point. Anything already reading work hours reads the special hours instead for that day.
Telling visitors the hours are unusual
When a special date applies, the Work Hours widget shows a notice above the hours. Configure it under Work Hours (VX) → Content → Special hours (VT):
| Setting | Description |
|---|---|
| Show special hours notice | Turn the notice on or off |
| Notice text | Wording shown, default "Special hours". Leave empty to show only the date's label |
| Show the date's label | Include the label entered on the special date |
| Show icon | Show a calendar icon before the text |
Styling lives under Style → Special hours (VT): background, text colour, typography, border, radius, padding, spacing and icon size/colour.
Dynamic tags
Two tags are added to the work-hours group so a template can call the day out by name:
| Tag | Returns |
|---|---|
@post(work_hours.special_today) | 1 when a special date overrides today, empty otherwise |
@post(work_hours.special_label) | The label given to today's special date |
Use special_today in a Voxel visibility condition to show a banner only on special days.
Timezones
"Is today the 25th?" is answered in the listing's own timezone, taken from the post's Timezone field where one exists, and the site timezone otherwise. A business in Auckland switches to its holiday hours at its own midnight, not the site's — which matters on any directory with listings in more than one region.
Search behaviour
Special hours change display, not search
On a holiday a listing reads "Closed" on its page and in every dynamic tag, but it can still match the Open now search filter that day.
Voxel's work-hours search index stores a repeating weekly pattern with no date dimension, so a specific calendar date can't be expressed in it. Filtering and sorting continue to use the regular weekly hours.
Notes
- A listing with no special dates behaves exactly as before.
- Entries with an invalid date, or set to "Enter hours" with no times, are discarded on save.
- Disabling the field or the plugin reverts everything to regular work hours; nothing is lost.
- A special date set on a listing with no regular Work Hours still displays — the remaining days read "Not available".

