Opening Hours Field
This plugin adds an Opening Hours custom field to Strapi's Content-Type Builder. The field stores structured JSON following Schema.org OpeningHoursSpecification conventions, making it ready for SEO and structured data integration.
Strapi Plugin: Opening Hours
A custom field plugin for Strapi v5 that provides a rich UI for managing business opening hours, split shifts, and special/holiday schedules.
Overview
This plugin adds an Opening Hours custom field to Strapi's Content-Type Builder. The field stores structured JSON following Schema.org OpeningHoursSpecification conventions, making it ready for SEO and structured data integration.
Features
- Weekly schedule — per-day open/closed toggle with time pickers
- Split shifts — multiple time slots per day (e.g. lunch + dinner)
- Copy hours — replicate one day's schedule to weekdays or all days
- Special/holiday hours — named overrides with date ranges
- Preview tab — read-only formatted summary of the full schedule
- Schema.org compatible — JSON output follows
OpeningHoursSpecification - Strapi Design System — built entirely with native Strapi components
Screenshots
Regular Hours
Set opening and closing times for each day of the week, with per-day open/closed toggles.
Split Shifts
Add multiple time slots per day to handle lunch breaks, split shifts, or varying schedules.
Copy Hours
Quickly replicate one day's schedule to all weekdays or all days at once.
Special Hours
Define named overrides for holidays or special events, with date ranges and open/closed status.
Preview
A read-only summary of the full schedule, including both regular and special hours.
Quick Start
1. Install
yarn add @opkod-france/strapi-plugin-opening-hours2. Enable the plugin
// config/plugins.ts
export default () => ({
'opening-hours': {
enabled: true,
},
});3. Rebuild and start
yarn build
yarn develop4. Add the field
- Open the Content-Type Builder
- Add a new custom field and select Opening Hours
- Save the content type
- The field appears in the content editor with three tabs: Regular Hours, Special Hours, and Preview
JSON Structure
The field stores a single JSON object with two arrays:
{
"regularHours": [
{
"dayOfWeek": "Monday",
"isOpen": true,
"timeSlots": [
{ "opens": "09:00", "closes": "12:00" },
{ "opens": "14:00", "closes": "18:00" }
]
},
{
"dayOfWeek": "Sunday",
"isOpen": false,
"timeSlots": []
}
],
"specialHours": [
{
"label": "Christmas Day",
"validFrom": "2025-12-25",
"validThrough": "2025-12-25",
"isOpen": false,
"timeSlots": []
}
]
}Field Reference
| Field | Type | Description |
|---|---|---|
dayOfWeek | string | Schema.org day name (Monday–Sunday) |
isOpen | boolean | Whether the business is open |
timeSlots | array | Time ranges; empty when closed |
opens / closes | string | Time in HH:MM 24-hour format |
label | string | Name for a special hours entry |
validFrom / validThrough | string | ISO date (YYYY-MM-DD) |
Development
# Install dependencies
yarn install
# Build the plugin
yarn build
# Watch mode (rebuilds on changes)
yarn watch
# Run tests
yarn test
# Run tests in watch mode
yarn test:watchLocal Development
Link the plugin for local testing:
# In the plugin directory
yarn link
# In your Strapi project
yarn link @opkod-france/strapi-plugin-opening-hoursThen add an explicit resolve path in config/plugins.ts:
export default () => ({
'opening-hours': {
enabled: true,
resolve: './node_modules/@opkod-france/strapi-plugin-opening-hours',
},
});Requirements
| Dependency | Version |
|---|---|
| Strapi | >= 5.0.0 |
| Node.js | >= 18 |
| React | 17.x or 18.x |
Contributing
Contributions are welcome! Please open an issue or submit a pull request.
This project uses conventional commits and semantic-release for automated versioning.
License
Install now
npm install @opkod-france/strapi-plugin-opening-hours
Create your own plugin
Check out the available plugin resources that will help you to develop your plugin or provider and get it listed on the marketplace.