@opkod-france/strapi-plugin-opening-hours
v1.0.2
Published
A Strapi custom field plugin for managing business opening hours with split shifts and special/holiday hours
Maintainers
Readme
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
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.
