Image
Image

Business Hours & Holiday Schedule Manager

설명

Business Hours & Holiday Schedule Manager is a business hours plugin for WordPress that shows your customers exactly when you are open. Set your weekly opening hours, add holiday and special-date hours, and display a live Open Now / Closed badge on any page. It also adds Schema.org opening hours markup so search engines can read your hours.

It suits local shops, restaurants, cafés, clinics, salons, agencies and any other business with set opening times. No coding is needed, and the plugin makes no external requests.

🎥 See Business Hours in Action:

📖 View Documentation | 🌐 WebTend

What you can do with it

  • Build a weekly opening hours schedule with a switch for each day
  • Add up to 4 time slots per day for lunch breaks and split shifts
  • Show a live open now / closed status badge that refreshes without reloading the page
  • Set holiday hours and special dates: closed all day, or custom hours for that date
  • Use your own timezone, so the status never depends on the server clock
  • Output JSON-LD (business type, address, phone, openingHours and holiday hours) for search engines
  • Place your hours with a Gutenberg block, a classic widget, a shortcode or an Elementor widget
  • Rename the Open and Closed labels and choose 12-hour or 24-hour time

Weekly schedule builder

Toggle each day on or off and set its opening and closing times. Quick-fill presets (Mon–Fri 9–5, Mon–Sat 10–6, 7 days 9–9) set up a standard week in one click, and “Apply to all days” or “Copy to Mon–Fri” saves retyping when several days share the same hours.

Live open/closed status badge

Visitors see whether you are open right now and when that changes next, for example “Closes at 5:00 PM”. The badge is rendered on the server and refreshed with a lightweight AJAX request. The refresh interval is 60 seconds by default and can be turned off in Settings.

Holiday and special dates manager

Holidays always override the weekly schedule. Mark a date as closed, or give it reduced hours such as Christmas Eve 10:00–14:00. Search the list, filter by month and page through large lists.

Schema.org opening hours markup

The plugin prints a single JSON-LD block with your business name, type, URL, phone number, address, price range, logo and openingHours, built from your weekly schedule. Upcoming holidays are added as special opening hours. Fill in Settings Business Details and the markup is ready, with no code. Search engines may use structured data like this to understand your business. You can also change the type with a filter, or turn the markup off.

Ways to display your hours

  • Gutenberg block: “Business Hours”, with a live preview in the editor
  • Classic widget: add it from Appearance Widgets
  • Shortcode: [webtend_business_hours] or [webtend_business_hours show_status="false"]
  • Elementor widget: appears automatically when Elementor 3.5 or later is active

Works with block themes, classic themes and page builders. Front-end styles and scripts only load on pages that show your hours.

Built for speed, accessibility and privacy

  • No jQuery: plain JavaScript only
  • No external requests, tracking, or third-party services
  • Accessible markup: the status badge is announced to screen readers, hours tables use proper row headers, and admin controls have visible keyboard focus
  • Translation-ready with a .pot file included
  • Removes its options and database table when you delete the plugin

For developers

  • webtend_bh_output_schema: return false to skip the JSON-LD block, for example on specific pages
  • webtend_bh_schema_type: change LocalBusiness to another Schema.org type such as Restaurant
  • webtend_bh_schema_data: add or change properties such as address, telephone or geo
  • Front-end CSS custom properties (--wbh-today-color, --wbh-font-size, --wbh-radius, --wbh-row-padding, --wbh-badge-radius) for theming without overrides

스크린샷

설치

  1. In WordPress, go to Plugins Add New and search for “Business Hours & Holiday Schedule Manager”, or upload the webtend-business-hours folder to /wp-content/plugins/.
  2. Click Activate.
  3. Open Business Hours in the admin sidebar.
  4. On Settings, choose your timezone first.
  5. On Weekly Schedule, set your opening hours and click Save schedule.
  6. On Holidays, add any closed dates or reduced-hours days.
  7. Add the Business Hours block, the widget, or the shortcode [webtend_business_hours] to a page.

FAQ

How do I add business hours to my WordPress website?

Activate the plugin, set your weekly hours under Business Hours Weekly Schedule, then add the Business Hours block to a page, or paste the shortcode [webtend_business_hours] anywhere.

How do I show an “Open Now” badge?

The live status badge is shown by default with the block, widget, shortcode and Elementor widget. To hide it, use [webtend_business_hours show_status="false"] or switch off “Show live status badge” in the block or widget settings.

Can I show a lunch break or split shifts?

Yes. Each day supports up to 4 time slots. For example, add 09:00–12:00 and 13:00–17:00 to show a lunch break.

How do I set holiday hours?

Go to Business Hours Holidays, pick the date and either leave “Closed all day” on or turn it off to enter custom opening and closing times. A holiday replaces the weekly schedule for that date.

Does the status use my local time?

Yes. Choose your timezone under Settings. All open/closed calculations use it, not the server clock.

How does the live status update?

A lightweight AJAX request refreshes the badge every 60 seconds by default. Change the interval under Settings, or set it to 0 to turn automatic refresh off.

Does it add Schema.org opening hours markup?

Yes. The plugin outputs JSON-LD with your business type, name, address, phone number, openingHours (one entry per time slot) and your upcoming holidays as specialOpeningHoursSpecification. Set the details under Settings Business Details, and turn the markup or the holiday part off under Settings. The plugin cannot guarantee how any search engine will use the data.

How do I add my address and phone number to the schema?

Go to Business Hours Settings Business Details and Address, fill in your details and save. Developers can add anything else, such as social profile links, with the webtend_bh_schema_data filter:

add_filter( 'webtend_bh_schema_data', function( $schema ) {
    $schema['sameAs'] = array(
        'https://www.facebook.com/yourpage',
        'https://www.instagram.com/yourpage',
    );
    return $schema;
} );

Can I turn off the schema on one page?

Yes:

add_filter( 'webtend_bh_output_schema', function( $output ) {
    return is_page( 'contact' ) ? false : $output;
} );

Does it work with block themes, page builders and Elementor?

Yes. The block, widget and shortcode work with block themes and classic themes. The Elementor widget registers only when Elementor 3.5 or later is active; Elementor is not required.

Does it work with WooCommerce?

Yes. It runs alongside WooCommerce without conflicts. WooCommerce is not required.

Can I manage hours for more than one location?

Not currently. The plugin manages one schedule per site (each site in a multisite network has its own).

Does it contact any external server?

No. There are no remote requests, tracking, or external fonts or scripts.

What happens to my data if I delete the plugin?

Deleting the plugin from the Plugins screen removes its options and the holidays database table. Your pages are not changed, but a leftover shortcode will show as plain text.

Where can I get support?

Post in the plugin support forum. We aim to reply within 2 business days.

후기

이 플러그인에 대한 평가가 없습니다.

기여자 & 개발자

“Business Hours & Holiday Schedule Manager”(은)는 오픈 소스 소프트웨어입니다. 다음의 사람들이 이 플러그인에 기여하였습니다.

기여자

자국어로 “Business Hours & Holiday Schedule Manager”(을)를 번역하세요.

개발에 관심이 있으십니까?

코드 탐색하기는, SVN 저장소를 확인하시거나, 개발 기록을 RSS로 구독하세요.

변경이력

1.0.2

  • New: Business Details settings — choose your business type (restaurant, dentist, store and more), business name, phone number, price range and address. They are added to the Schema.org markup, so you no longer need code to add an address or phone number.
  • New: Upcoming holidays are now included in the Schema.org markup as special opening hours (closed days and custom-hours days). Can be switched off under Settings.
  • New: The theme’s custom logo is added to the Schema.org markup when one is set.
  • Fix: Saving the weekly schedule, holidays and settings from the admin screen now works reliably. The admin sent its data as JSON, which the server did not read, so a save could be rejected or, for settings, reset to defaults.
  • Fix: Holiday dates are now validated as real calendar dates, and the Schema.org cache is refreshed when a holiday is added, changed or deleted.
  • Fix: A timezone stored as a fixed UTC offset (for example +06:00) stays selected on the Settings screen instead of switching to the first timezone in the list.

1.0.1

  • Fix: Translations are no longer loaded before WordPress init (resolves the WordPress 6.7+ “translation loaded too early” notice). Default status labels now follow the site language at display time; the Business Hours widget is registered on widgets_init.
  • Fix: Holidays table is now created with dbDelta()-compatible SQL, and a clear admin notice is shown if the table cannot be created. Activation prints no output.
  • Fix: Activation now checks the minimum PHP and WordPress versions and explains the problem instead of failing. Removed unnecessary rewrite-rule flushing on activation and deactivation.
  • Fix: The “Add split shift” editor could not be opened from the Weekly Schedule screen. Also fixed several admin layout issues (Today chip overlap, holiday date column, “Closed all day” toggle row, hours table wrapping on the frontend) and scoped the admin .required style so it no longer reaches other WordPress screens.
  • Fix: A JavaScript error on the Weekly Schedule screen stopped the admin scripts that load after it, including the Save buttons. The quick-fill presets now load correctly and each admin script starts independently, so one failure can no longer disable the rest.
  • Fix: Block editor strings are now translatable.
  • Fix: Timezones set as a fixed UTC offset (for example +06:00) are now accepted and used as the default.
  • Fix: Resolved all PluginCheck.Security.DirectDB.UnescapedDBParameter warnings in DataStore.php — table name now wrapped with esc_sql() at every query site.
  • Fix: Each AJAX handler now verifies its own dedicated nonce (wbh_save_schedule_nonce, wbh_save_settings_nonce, wbh_save_holiday_nonce, wbh_delete_holiday_nonce, wbh_get_holidays_nonce). Shared nonce removed.
  • Fix: SVG icon output in admin nav escaped via wp_kses() — phpcs:ignore removed.
  • UX: Save buttons are now disabled during AJAX requests to prevent accidental double-saves on slow connections and re-enabled automatically after the request completes (success or error).
  • UX: Holiday date picker now shows an inline warning when a past date is selected, preventing stale holiday entries.
  • SEO: Updated plugin tags to include holiday, schema, and opening hours for better WordPress.org directory discovery.
  • UX: Added Quick-fill preset buttons (Mon–Fri 9–5, Mon–Sat 10–6, 7 Days 9–9) above the schedule builder for one-click setup. Dramatically reduces time from install to configured.
  • UX: Added “Apply to all days” and “Copy to Mon–Fri” buttons inside each day’s slot editor to eliminate repetitive data entry when hours are the same across multiple days.
  • UX: Holiday list now has a live search input (filters by label, 300ms debounce) and a month picker filter. Both send server-side AJAX requests so large holiday lists remain performant.
  • UX: Holiday list is now paginated at 20 entries per page with accessible numbered pagination controls and a results counter (“1–20 of 47”).
  • A11Y: Frontend status bar now uses role=”status” with aria-live=”polite” and aria-atomic=”true” for WCAG 2.1 AA compliant screen-reader announcements on AJAX refresh.
  • A11Y: Hours table rows now carry data-day attribute (fixes silent JS bug in updateTodayRow). Day column changed from to for correct table semantics. Table thead is no longer hidden via class on the element — individual cells use screen-reader-text instead, so scope attributes are correctly exposed to AT.
  • A11Y: All interactive admin elements (toggles, buttons, inputs, nav items) now have visible :focus-visible outlines meeting WCAG 2.1 AA contrast requirements.
  • Frontend: Exposed –wbh-today-color, –wbh-font-size, –wbh-radius, –wbh-row-padding, and –wbh-badge-radius as documented CSS custom properties. Full theming API documented in frontend.css header comment.

1.0.0 — 2025-07-07

  • Initial release
  • Weekly schedule builder with multi-slot support per day
  • Holiday / special dates manager with DB storage
  • Real-time open/closed AJAX status badge
  • Timezone-aware status calculations
  • Schema.org LocalBusiness JSON-LD output
  • Gutenberg block (server-side rendered)
  • Classic WordPress widget
  • Shortcode [webtend_business_hours]
  • Settings: timezone, time format, custom labels, schema toggle, refresh interval
  • Plugin action links and requirements check on activation