What is Business Hours & Holiday Schedule Manager?
Business Hours & Holiday Schedule Manager is a complete opening-hours system for WordPress: a weekly schedule builder, a holiday and special-dates manager, a live Open / Closed status badge, and automatic Schema.org markup so search engines can read your hours too. It suits local shops, restaurants, clinics, and any service business — no coding required.
It is entirely self-hosted: your schedule lives in two WordPress options and one small database table, there is no jQuery dependency, no external service, and the plugin never contacts a remote server. Front-end CSS and JavaScript only load on pages that actually display your hours.
openingHours and holiday hours — set up in Settings, no code.The weekly schedule builder — Quick fill presets above the list, and Wednesday open for editing with the copy buttons.
System Requirements
The plugin checks its requirements when you activate it. If PHP or WordPress is too old, it deactivates itself and explains why instead of failing. WooCommerce and Elementor are not required.
| Component | Minimum | Notes |
|---|---|---|
| WordPress | 6.2 | Tested up to 7.0 |
| PHP | 7.4 | Checked on activation and on every load |
| WooCommerce | Optional | Runs alongside it with no conflicts; HPOS declared compatible |
| Elementor | Optional | The Business Hours widget only registers if Elementor 3.5+ is active |
.pot file includedInstallation
Method A — WordPress Plugin Directory (Recommended)
Search in WordPress Admin
Go to Plugins → Add New and search for Business Hours & Holiday Schedule Manager.
Install & Activate
Click Install Now, then Activate. Activation creates a small holidays table and sets a default Mon–Fri, 9:00 AM–5:00 PM schedule.
Open the Admin Screen
Click Business Hours in the admin sidebar to set up your real hours.
Method B — Manual Upload
Upload
Download webtend-business-hours.zip, then go to Plugins → Add New → Upload Plugin and install the ZIP. Or unzip it into /wp-content/plugins/.
Activate
Click Activate Plugin. The Business Hours menu appears in the admin sidebar.
Set Your Hours
Use the Weekly Schedule, Holidays and Settings tabs, then add the hours to a page.
Quick Start
After activation you will find Business Hours in your WordPress admin menu.
- On Settings, choose your timezone first — every open/closed calculation depends on it
- On Weekly Schedule, pick a Quick fill preset or toggle the days you are open and click the edit icon to set times or add a split shift, then Save schedule
- On Holidays, add any closed dates or reduced-hours days
- Add the hours to a page with the Business Hours block, the widget, or
[webtend_business_hours] - Check the Shortcodes & Usage tab any time for copy-ready usage examples
Weekly Schedule
Each day has an on/off toggle and a list of time slots. A day that is switched off shows as Closed everywhere. Today's row carries a Today chip so you can see at a glance which day the status badge is reporting on.
Split shifts and lunch breaks
Click the edit icon on a day to open its slot editor. Set the first open and close times, then use + Add split shift to add another slot — up to 4 per day. A morning slot of 09:00–12:00 plus an afternoon slot of 13:00–17:00 gives you a lunch break. Remove any extra slot with its ✕ button.
Quick-fill presets
Above the day list, the Quick fill bar sets up a standard week in one click: Mon–Fri 9–5, Mon–Sat 10–6 or 7 Days 9–9. A preset fills the form only — nothing is stored until you click Save schedule, so you can tweak any day afterwards.
Copy hours to other days
When a day’s editor is open, Apply to all days copies that day’s slots to every day, and Copy to Mon–Fri copies them to the weekdays only. It saves retyping when several days share the same hours.
Saving
Changes are saved over AJAX when you click Save schedule — no page reload. The time chips on each row reflect your edits as you make them.
Holidays & Special Dates
Holidays always override the weekly schedule for their date. Use them for public holidays, staff days, or reduced hours.
Adding a holiday
Pick a Date, give it an optional Label, and leave Closed all day on. Switch it off to reveal opening and closing times for a custom-hours day (for example Christmas Eve, 10:00–14:00). Each date holds one entry — saving the same date again updates it.
The holiday manager — add form, search and month filter, and the upcoming list.
Searching and filtering
Use Search by label… to find a holiday by name and the month picker to show a single month. Clear resets both. Lists longer than 20 entries are paged, with controls at the bottom of the list. Search and paging update over AJAX, without reloading the screen.
If you pick a date in the past, a warning appears under the date field so you do not add a holiday that will never show.
Removing a holiday
Click the trash icon next to any entry in Upcoming holidays.
Live Status & Timezone
The status badge says whether you are open right now and when that will change. It is rendered on the server, then kept fresh by a lightweight AJAX poll so a visitor who leaves a tab open still sees the right answer.
Refresh interval
The default is 60 seconds. Set it under Settings → Live status refresh interval; enter 0 to turn automatic refresh off entirely.
Labels and time format
Rename the badge text with Open label and Closed label. Leave either blank to use the translated defaults ("Open Now" / "Closed") in your site language. Choose 12-hour, 24-hour, or 12-hour lowercase display.
Timezone, labels, schema options, Business Details and Address.
The front-end status badge and hours table, with today highlighted.
Schema.org Markup
On every front-end page the plugin prints one JSON-LD script describing your business, built from your settings and weekly schedule. Turn it off with Settings → Schema.org markup.
Business Details
Fill in Settings → Business Details and Address: business type (restaurant, dentist, store and 18 more), business name (blank uses your site title), phone number, price range, and address. Only fields you fill in are output. The theme’s custom logo is added automatically when one is set.
Holiday hours
Upcoming holidays (up to 100, within the next 400 days) are added as specialOpeningHoursSpecification. A closed day uses 00:00–00:00, the schema.org convention for closed all day; a custom-hours day uses its own times. Switch this off with Include holiday hours. The list is cached and refreshed when you add, change or delete a holiday.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Restaurant", "name": "Harbor Street Café", "url": "https://example.com", "telephone": "+1 800 555 0100", "priceRange": "$$", "address": { "@type": "PostalAddress", "streetAddress": "123 Main St", "addressLocality": "Springfield", "addressRegion": "IL", "postalCode": "62701", "addressCountry": "US" }, "openingHours": ["Mo 09:00-13:00", "Mo 14:00-18:00", …], "specialOpeningHoursSpecification": [{ "@type": "OpeningHoursSpecification", "validFrom": "2026-12-25", "validThrough": "2026-12-25", "opens": "00:00", "closes": "00:00", "name": "Christmas Day" }] } </script>
webtend_bh_schema_data filter is still there for anything extra, such as social profile links.Block, Widget & Elementor
Gutenberg block
Insert
In the editor, click + and search Business Hours.
Preview
The block renders a live server-side preview of your real hours.
Options
In the block sidebar, Display Options → Show live status badge toggles the badge. The block also supports wide/full alignment, colors and spacing.
Classic widget
Go to Appearance → Widgets and add Business Hours to any widget area. Set a Title and choose whether to Show live open/closed status. It works in both the block-based widget editor and the classic widgets screen.
Elementor widget
If Elementor 3.5+ is active, a Business Hours widget appears in the Elementor panel. Content controls the status badge toggle. Style adds color controls for the Open and Closed badge (text and background), badge and row typography, day-name, hours, today-highlight and divider colors, and row padding.
Shortcode
[webtend_business_hours][webtend_business_hours show_status="false"]| Attribute | Default | Notes |
|---|---|---|
| show_status | true | true or false — show the live status badge above the table |
Paste the shortcode into any page, post, sidebar, or template via do_shortcode(). Assets load only on pages where the shortcode, block or widget actually appears.
All Settings
Everything on the Settings tab, plus where the data is stored.
| Setting | Default | Notes |
|---|---|---|
| Timezone | site timezone at install | Any PHP timezone or fixed offset such as +06:00; used for all open/closed calculations |
| Time display format | g:i A | g:i A (9:00 AM), H:i (09:00) or g:i a (9:00 am) |
| Open label | Open Now | Leave blank to use the translated default |
| Closed label | Closed | Leave blank to use the translated default |
| Schema.org markup | on | Prints the JSON-LD block |
| Include holiday hours | on | Adds upcoming holidays to the Schema.org markup |
| Live status refresh interval | 60 | Seconds, 0–3600; 0 turns refresh off |
| Business type | General local business | A schema.org type such as Restaurant, Dentist or Store |
| Business name | site title | Name used in the Schema.org markup |
| Phone number | — | Digits, spaces and + - ( ) only |
| Price range | — | For example $$ |
| Street, City, State/region, Postal code | — | Output as a PostalAddress when any is filled in |
| Country code | — | Two-letter ISO code such as US, GB or BD |
Stored data
| Item | Type | Contains |
|---|---|---|
| wbh_schedule | option | Weekly schedule: enabled flag and time slots per day |
| wbh_settings | option | The settings above |
| wbh_version | option | Installed version, used for upgrades |
| wbh_db_error | option | Set only if the holidays table could not be created; triggers an admin notice |
| {prefix}wbh_holidays | table | Holiday dates, labels, closed flag and custom hours |
Hooks & Filters
For developers and agencies who need to customize output without editing plugin files.
| Hook | Type | Purpose |
|---|---|---|
| webtend_bh_output_schema | filter | Return false to skip the JSON-LD block (for example on specific pages) |
| webtend_bh_schema_type | filter | Change the Schema.org type from LocalBusiness to any other type |
| webtend_bh_schema_data | filter | Add or change any property — for example sameAs or geo — before output |
| wbh_get_status | AJAX action | Public (wp_ajax_nopriv_) endpoint the live badge polls; nonce-protected |
add_filter( 'webtend_bh_schema_data', function( $schema ) { $schema['sameAs'] = array( 'https://www.facebook.com/yourpage', 'https://www.instagram.com/yourpage', ); return $schema; } );
add_filter( 'webtend_bh_output_schema', function( $output ) { return is_page( 'contact' ) ? false : $output; } );
add_filter( 'webtend_bh_schema_type', function() { return 'Restaurant'; } );
CSS custom properties (theming)
Every visual token is a custom property on .wbh-widget, so you can restyle the block, widget and shortcode from your theme stylesheet without !important.
| Property | Default | Controls |
|---|---|---|
| --wbh-open | #16a34a | Open status colour |
| --wbh-open-bg | #dcfce7 | Open badge background |
| --wbh-closed | #dc2626 | Closed status colour |
| --wbh-closed-bg | #fee2e2 | Closed badge background |
| --wbh-accent | #4f46e5 | Accent and today highlight |
| --wbh-today-bg | #eef2ff | Today row background |
| --wbh-today-color | inherit | Today row text colour |
| --wbh-text | inherit | Primary text colour |
| --wbh-text-muted | #64748b | Secondary text colour |
| --wbh-border | #e2e8f0 | Table row border colour |
| --wbh-font | inherit | Font family |
| --wbh-font-size | 0.9rem | Base font size |
| --wbh-radius | 6px | Border radius |
| --wbh-row-padding | 8px 0 | Table row padding |
| --wbh-badge-radius | 999px | Status badge border radius |
.wbh-widget {
--wbh-accent: #be123c;
--wbh-today-bg: #ffe4e6;
--wbh-font-size: 1rem;
}Frequently Asked Questions
Does this work with WooCommerce?
How does the live status update?
0 to disable automatic refresh.Can I show a lunch break?
What happens on a holiday?
Does it help my SEO?
Are my holidays included in the Schema.org markup?
00:00–00:00. Turn it off with Include holiday hours in Settings.Is it compatible with block themes?
Does it need Elementor?
Does it contact any external server?
Is the plugin translation ready?
webtend-business-hours text domain, and a .pot file is included in /languages.What is removed when I delete the plugin?
wbh_holidays table. Your pages are not modified, but any shortcode left in content will show as plain text.Can I manage hours for more than one location?
Is it accessible?
How do I change the colours or fonts?
--wbh-* custom properties on .wbh-widget in your theme CSS. See Hooks & Filters for the full list.