Title: IngotForge Opening Hours Indicator
Author: ingotpress
Published: <strong>October 17, 2026</strong>
Last modified: October 17, 2026

---

Search plugins

![](https://ps.w.org/ingotforge-opening-hours-indicator/assets/banner-772x250.png?
rev=3751316)

![](https://ps.w.org/ingotforge-opening-hours-indicator/assets/icon-256x256.png?
rev=3751316)

# IngotForge Opening Hours Indicator

 By [ingotpress](https://profiles.wordpress.org/ingotpress/)

[Download](https://downloads.wordpress.org/plugin/ingotforge-opening-hours-indicator.2.1.1.zip)

 * [Details](https://wordpress.org/plugins/ingotforge-opening-hours-indicator/#description)
 * [Reviews](https://wordpress.org/plugins/ingotforge-opening-hours-indicator/#reviews)
 *  [Installation](https://wordpress.org/plugins/ingotforge-opening-hours-indicator/#installation)
 * [Development](https://wordpress.org/plugins/ingotforge-opening-hours-indicator/#developers)

 [Support](https://wordpress.org/support/plugin/ingotforge-opening-hours-indicator/)

## Description

IngotForge Opening Hours Indicator displays whether your business is open or closed.
Create independent schedules for multiple locations, with their own timezones, labels
and appearance.

Existing [business_status] and [opening_status] shortcodes, schedule IDs, weekly
hours, manual holiday closures and typography/color settings are retained. Legacy
appearance remains the default. See Installation for the removal of misspelled prerelease
identifiers.

Main features:

 * Multiple schedules, each with its own business timezone and open/closed labels.
 * Up to 12 daily intervals, split shifts, overnight hours and 24-hour days.
 * One-off closures, annually recurring MM-DD closures and date-specific special
   hours.
 * Temporary or indefinite force-open / force-closed overrides.
 * Existing prefix/postfix, font, size, weight and separate open/closed color controls.
 * Optional pill, dot and outlined indicator appearances.
 * Optional next opening/closing prediction, subject to available holiday coverage.
 * Accessible weekly timetable and business-local clock shortcodes.
 * Same-site live updates; provider services are never called from visitors’ browsers.
 * Seven built-in holiday adapters, five built-in clock adapters and custom HTTPS
   JSON adapters.
 * Manual schedules and the local server clock work without accounts or external
   services.
 * A responsive administration area with Schedules, Service directory, Manual & 
   tutorials, and Tools & data.
 * Schedule duplication and additive JSON import/export without credentials.
 * Explicit public/private schedule visibility and optional data removal on uninstall.
 * Local, readable JavaScript/CSS. No advertising, telemetry, remote executable 
   assets or bundled font libraries.

Open **Opening Hours > Manual & tutorials** for the complete local instructions,
examples, rule priority, troubleshooting and developer reference.

External providers may require an account, a paid plan, sponsorship, attribution
or a storage license. Coverage and availability are provider-specific. The plugin
does not supply paid credentials, circumvent provider limits or promise compatibility
with every date/time API. See External services below.

### WordPress.org submission identity

This package uses ingotforge-opening-hours-indicator as its proposed submission 
slug, matching the requested IngotForge spelling. The ZIP has one root folder with
that name, the main plugin file is ingotforge-opening-hours-indicator.php, and all
translation calls use the same domain. The translation template is languages/ingotforge-
opening-hours-indicator.pot.

This package does not reserve or confirm a WordPress.org permalink. Match the exact
slug shown in your submission confirmation. For an existing pending submission with
a different slug, request/confirm the change through that submission rather than
creating a duplicate submission. Do not change an already approved slug through 
a local folder rename. New internal identifiers use IFGOHI/ifgohi or the IngotForge
PHP namespace. Misspelled prerelease shortcodes, namespaces, routes, events, admin-
page aliases and export-format identifiers are not registered or accepted.

### Shortcode examples

#### Existing status indicator

[business_status id=”1″]

[opening_status id=”1″]

#### Status with the next predicted change

[ingotforge_hours id=”1″ show_next=”true” live=”true”]

The current and legacy status aliases support id, show_next (default false) and 
live (default true). live=”false” disables status polling.

#### Weekly opening-hours table

[ingotforge_schedule id=”1″ caption=”Office opening hours”]

#### Business-local clock

[ingotforge_clock id=”1″ seconds=”true” format=”24″]

seconds defaults to false; format accepts 12 or 24. Invalid, missing, deleted or
private schedule IDs return no output.

### External services

#### Common request and privacy behavior

All integrations are optional. New and imported schedules require administrator 
authorization. Existing explicit provider selections are retained during the 1.x
upgrade; administrators can disable authorization at any time.

Requests occur only on administrator refresh or scheduled WordPress cron. Normal
shortcode/REST display does not initiate external requests. Saving configuration
does not fetch a provider. Requests use WordPress’s safe HTTP API, HTTPS, certificate
verification, no redirects, a five-second timeout and a 1 MB response limit.

Holiday providers receive the configured country, optional subdivision, requested
year/date and applicable filtering parameters. Clock providers receive a UTC timezone
identifier and the account key where required. Each operator also sees the server’s
source IP, request time and plugin-version user agent. The plugin does not send 
visitor IPs, cookies, names, emails, page content or WordPress login data to providers.
Provider keys may be transmitted in query parameters when that provider requires
it; protect server/proxy logs accordingly.

Custom endpoints receive only the configured placeholders and authentication value.
Do not put personal data or credentials directly into their URL. Only public HTTPS
GET JSON, none/header/query/Bearer authentication and dot-separated field mappings
are supported; not OAuth flows, signed requests, POST-only APIs, XML or NTP.

Responses are normalized to holiday dates or a clock correction; the raw provider
response is not stored. HolidayAPI cache use is capped at 24 hours, Calendarific
at 30 days, and other newly dated holiday caches at 400 days. Expired entries are
ignored on reading; physical deletion runs during refresh/cron or explicit cache
clearing. WP-Cron depends on traffic, so arrange reliable server cron and a backup-
retention policy when your provider has deletion deadlines. Clear service caches
on plan cancellation. Licenses can change; these safeguards do not replace your 
provider agreement.

#### Holiday services

**Nager.Date / Nager.Holidays**

Uses https://nagerholidays.com/api/v4/Holidays/{country}/{year}. Keyless annual 
holiday dates, with national/subdivision filtering. Commercial hosted-service use
requires active sponsorship under current terms.
 Documentation: https://nagerholidays.
com/api Terms: https://nagerholidays.com/legal/termsofservice Privacy: https://nagerholidays.
com/legal/privacy

**OpenHolidays API**

Uses https://openholidaysapi.org/PublicHolidays with countryIsoCode, languageIsoCode,
validFrom, validTo and optional subdivisionCode. Keyless selected-country public
holidays. The data is ODbL-licensed; observe attribution and other applicable data-
license requirements.
 Documentation: https://www.openholidaysapi.org/en/ Terms /
ODbL permitted use: https://www.openholidaysapi.org/en/faq/ Operator privacy policy:
https://www.stueber.de/en/legal/privacy.php

**HolidayAPI-compatible configured adapter**

No HolidayAPI endpoint is preconfigured or contacted automatically in this release.
The administrator supplies the authorized HTTPS endpoint plus the actual terms and
privacy-policy URLs from their service agreement. Missing policy information pauses
requests without deleting saved schedules or keys. This avoids representing an unverified
privacy URL as a verified service policy.
 When enabled, this adapter sends key,
country/subdivision, year and optional public filtering to that configured operator
on refresh/cron. Its HolidayAPI response parser, actual/observed/both modes and 
24-hour cache cap are retained. Plan coverage and storage permission must be checked
with the operator. The current service documentation is https://holidayapi.com/docs(
an informational link, not a runtime endpoint or substitute for operator policies).

**Calendarific**

Uses https://calendarific.com/api/v2/holidays with api_key, country, year, optional
location and holiday type. Free/paid access is plan-dependent. Its terms require
visible attribution unless your agreement waives it. Add the provider’s required
credit to your About/terms or relevant page; the plugin does not inject a forced
public backlink. Stored holiday data expires within 30 days of the original fetch
timestamp.
 Documentation: https://calendarific.com/api-documentation Terms: https://
calendarific.com/terms Privacy: https://calendarific.com/privacy

**Abstract Holidays**

Uses https://holidays.abstractapi.com/v1/ with api_key, country, year and, in daily
mode, month/day. Select daily mode for plans requiring a complete date. Annual mode
requires a plan permitting year-only requests. Daily responses cover only checked
dates, not the full year; midnight/cron gaps can occur.
 Documentation: https://
docs.abstractapi.com/api/holidays Terms: https://www.abstractapi.com/legal/legal#
terms Privacy: https://www.abstractapi.com/legal/legal#privacy

**API Ninjas Holidays**

Uses https://api.api-ninjas.com/v2/holidays with country, year, optional type and
X-Api-Key. This cache-based integration requires storage permission, currently Business
or above. Free and Developer plans do not permit the plugin’s cache. An explicit
account-entitlement confirmation is required before requests.
 Documentation: https://
api-ninjas.com/api/holidays Plans/storage: https://api-ninjas.com/pricing Terms:
https://api-ninjas.com/tos Privacy: https://api-ninjas.com/privacy

**Enrico-compatible configured adapter**

There is no default connection to Kayaposoft’s hosted Enrico service. No verified
hosted-service terms/privacy URLs were established for that previous preset, so 
this release does not silently use it or equate its source-code license with a hosted-
service policy.

The Enrico date/range parser is retained for a licensed or self-hosted Enrico-compatible
HTTPS endpoint. Enter that endpoint, its real operator terms and privacy URLs, and
confirm that querying/caching is permitted. The configuration is required even for
an old saved Enrico selection. On refresh/cron, requests send action=getHolidaysForYear,
year, country, optional region, holidayType and any configured authentication to
the chosen operator. Existing manually entered holidays remain independent. Previously
cached good dates are retained within their normal expiry rules.

Project/self-hosting information: https://kayaposoft.com/enrico/
 Protocol reference:
https://kayaposoft.com/enrico/json/v2.0/docs.php These informational links do not
cause automatic service requests and are not terms/privacy policies for the endpoint
you configure. Obtain those policies from your actual operator, or choose another
documented preset.

#### Clock services

**TimeAPI-compatible configured adapter**

The TimeAPI dateTime parser is retained, without a default hosted endpoint. Configure
the authorized HTTPS endpoint, the operator’s actual permitted-use terms and privacy-
policy URLs, then confirm the policies. On refresh/cron it sends timeZone=Etc/UTC
and any configured authentication to that endpoint. Separate hosted API-use terms
were not verified for the former preset; a privacy document is not treated as permission
to use or cache an API.
 Protocol reference: https://timeapi.io/swagger/ Published
website privacy information: https://www.timeapi.io/Home/Privacy These are reference
links, not a substitute for the terms and privacy URLs required for your chosen 
endpoint.

**TimeZoneDB**

Uses https://api.timezonedb.com/v2.1/get-time-zone with key, format=json, by=zone
and zone=Etc/UTC. Requires a key and HTTPS-capable access. Free service is personal/
non-commercial; commercial use needs premium. Observe rate limits and relevant database
attribution obligations.
 Documentation: https://timezonedb.com/references/get-time-
zone Terms and privacy: https://timezonedb.com/terms-of-use

**API Ninjas World Time**

Uses https://api.api-ninjas.com/v1/worldtime with timezone=Etc/UTC and X-Api-Key.
The same storage-plan requirement and explicit confirmation apply as for API Ninjas
Holidays; paid account credentials are not bundled.
 Documentation: https://api-
ninjas.com/api/worldtime Plans: https://api-ninjas.com/pricing Terms: https://api-
ninjas.com/tos Privacy: https://api-ninjas.com/privacy

**IPGeolocation.io Time Zone**

Uses https://api.ipgeolocation.io/v3/timezone with apiKey and tz=Etc/UTC. It does
not perform visitor IP geolocation. Free access is non-commercial; obtain the license
appropriate for commercial/customer-facing use.
 Documentation: https://ipgeolocation.
io/documentation/timezone-api.html Terms: https://ipgeolocation.io/tos.html Privacy:
https://ipgeolocation.io/privacy.html

**timezone.io WorldTime compatibility**

Uses https://worldtime.timezone.io/api/timezone/Etc/UTC. This is timezone.io’s keyless
compatibility service, not the retired service previously operated as WorldTimeAPI.
Public-service availability is not guaranteed.
 Documentation: https://www.timezone.
io/docs/worldtimeapi Terms: https://www.timezone.io/legal/terms Privacy: https://
www.timezone.io/legal/privacy

**Custom holiday or clock service**

There is no preselected custom service. An administrator supplies the public HTTPS
GET URL, JSON field mappings, authentication mode, actual operator terms and privacy
URLs, and explicitly confirms authorization plus permitted caching. The plugin stores
those policy links locally and shows them in the schedule editor; it does not fetch
or certify the policy documents. Display the chosen provider and links in your own
site privacy notice where appropriate. Do not invent policy links or use a documentation
page instead. A self-hosted endpoint needs the real operator’s policies too.

The endpoint receives the literal administrator-supplied URL parameters, expanded{
year}, {country}, {region}, {date} or {timezone} placeholders and the selected authentication
value. Only holiday requests supply a year/date; clock timezone is Etc/UTC. The 
configured operator also receives the server IP, request time and plugin user agent.
No visitor data is added by the plugin. Requests occur only after authorization 
on refresh/cron. API keys use separate encrypted fields. Changing an endpoint clears
its old credential; imports and duplicates reset policy confirmation and authorization.

Placeholder URLs using example.com in the manual or field hints are fictional examples,
not providers, active endpoints, policies or accounts. JSON adapters do not support
OAuth, signed requests, POST-only endpoints, XML or NTP.

### Privacy

The plugin does not collect visitor profiles, analytics or telemetry, and does not
set tracking cookies. It stores business schedules, appearance settings, encrypted
credentials where supported, normalized service caches and refresh state in your
WordPress database. Public schedules expose their display status, colors and timezone
through a read-only endpoint; set a schedule private to remove its public output.

Suggested site privacy-policy text (adapt to your actual services):

“Our opening-hours display uses the schedules configured on this website. It can
refresh displayed status through our own website. Where we enable an external holiday
or clock provider, our server sends that provider the configured country/date or
UTC timezone and our service credential. The plugin does not send visitors’ personal
details or visitor IP addresses to those providers. Providers and our hosting infrastructure
may independently retain ordinary request logs.”

This wording is a starting point, not a statement about other plugins, your hosting
logs, a custom endpoint or a provider’s own practices.

### Developer Integration

Use the IngotForge\OpeningHours namespace, IFGOHI_VERSION / IFGOHI_PATH / IFGOHI_URL
constants and ifgohi-prefixed declarations. The former global OHI_* aliases and 
ohi_run_plugin() are intentionally no longer declared: their three-letter prefix
was flagged in review. Replace OHI_VERSION/PATH/URL with IFGOHI_VERSION/PATH/URL;
replace ohi_run_plugin() with IngotForge\OpeningHours\Plugin::boot(). Replace OHI_Frontend,
OHI_Core, OHI_Activator, OHI_API and OHI_Admin with the corresponding namespaced
LegacyFrontend, LegacyCore, LegacyActivator, LegacyAPI and LegacyAdmin classes. 
Do not expose raw rows, which include protected credentials.

Only the IngotForge\OpeningHours PHP namespace is provided. Branded shortcodes are
ingotforge_hours, ingotforge_schedule and ingotforge_clock. The original business_status
and opening_status tags remain supported; registration does not overwrite a tag 
already owned by another plugin. The REST namespace is ingotforge-hours/v1 and the
browser refresh event is ingotforge:hours:refresh. There are no misspelled prerelease
aliases. The timetable and clock attribute filters are shortcode_atts_ingotforge_schedule
and shortcode_atts_ingotforge_clock; the status renderer retains its original shortcode_atts_business_status
filter. Update custom integrations that used the retired spellings.

Export and import use the ingotforge-opening-hours format identifier with schema
1. For an older export bearing a misspelled format identifier, back up the JSON 
file and correct only its top-level format value to ingotforge-opening-hours before
importing. The schedules payload is unchanged, imports still create new IDs and 
omit credentials, and same-site upgrades do not require an import.

The active table is now {$wpdb->prefix}ifgohi_schedules. Read its name through Store::
table(), not a hardcoded name. The administrative page is ingotforge-opening-hours-
indicator; all command actions and nonces use ifgohi_. Reload old editor forms after
upgrading. Read-only bookmarks using the original opening-hours-indicator page are
redirected, never executed as write commands. Misspelled prerelease bookmarks must
be replaced.

 * ifgohi_status_html filters generated status HTML, receiving HTML, schedule ID
   and public status. The result passes through an allowed-HTML boundary.
 * GET /wp-json/ingotforge-hours/v1/status?ids=1,2&next=true returns display data
   for at most 20 public IDs, never raw configuration or keys.
 * Dispatch document.dispatchEvent(new Event(‘ingotforge:hours:refresh’)) after 
   inserting shortcode markup dynamically. The display script must already have 
   been enqueued.

There are no public write endpoints, remote executable libraries or bundled third-
party JavaScript dependencies. All distributed source files are readable and editable.
The plugin code is GPLv2-or-later; provider data/account terms are separate.

## Installation

 1. Back up the database and plugin files, and test the upgrade on staging first.
 2. For a fresh installation, upload this ZIP and activate IngotForge Opening Hours
    Indicator.
 3. For any earlier installation whose folder is not ingotforge-opening-hours-indicator,
    DEACTIVATE the old copy first. Do not use WordPress Delete/uninstall. Upload and
    activate only the new ingotforge-opening-hours-indicator copy.
 4. Activation migrates the old ohi_schedules table to ifgohi_schedules using your 
    site’s WordPress database prefix. The atomic rename preserves records, primary 
    keys and the next generated ID; existing settings and encrypted keys are not converted
    to new credentials. No export/import is required.
 5. A conflicting destination table or failed migration pauses writes and displays 
    an administrator notice. Neither table is dropped, combined or overwritten. Resolve
    database permissions/conflicting copies from a backup before retrying. Do not manually
    delete a table as a troubleshooting shortcut.
 6. Verify saved schedule IDs, manual holiday dates, labels, styles, shortcodes and
    public output. Reload any old open admin editor before saving. Review configured
    integrations and refresh only authorized services.
 7. After verification, remove the inactive OLD plugin folder using your hosting file
    manager or SFTP, not WordPress Delete. Keep the backup outside wp-content/plugins.
    Do not run both copies together. On multisite, verify migration on each site; it
    runs lazily when that site initializes the plugin.
 8. Existing installations already in ingotforge-opening-hours-indicator can use WordPress
    upload-and-replace for later releases. Full downgrades after the table migration
    require restoring the pre-upgrade database and files.

The branded shortcodes are [ingotforge_hours id=”1″], [ingotforge_schedule id=”1″]
and [ingotforge_clock id=”1″]. The original business_status and opening_status tags
also remain supported. Version 2.1.1 removes misspelled prerelease tags and other
misspelled aliases instead of retaining them for compatibility. Before upgrading,
update any affected page, widget, template, reusable block or page-builder shortcode
to the corresponding correctly spelled name; keep its ID and all other attributes
unchanged. The plugin does not automatically edit stored site content. Clear page
and asset caches after upgrading. Schedule records and IDs remain the same. Bookmarks
using the original opening-hours-indicator admin page still redirect; misspelled
bookmarks must be updated. Rename or regenerate custom translations using an earlier
text domain for ingotforge-opening-hours-indicator.

Deactivation clears service caches but retains schedules and keys. Enrico-compatible,
HolidayAPI and TimeAPI-compatible selections now require an administrator-configured
HTTPS endpoint, its actual terms/privacy links and policy confirmation. Their response
parsers and saved settings remain available; they are not silently redirected to
another provider. Manual holidays and the local clock require no external connection.

Minimum requirements: WordPress 6.2 and PHP 7.4. WordPress 6.2 is needed for identifier-
safe database placeholders. Sodium or OpenSSL with AES-GCM support is needed to 
save new encrypted credentials. A functioning WordPress HTTP API and public HTTPS
endpoint are needed only for external integrations.

## FAQ

### Does the rename change my existing shortcodes or records?

Version 2.1.0 corrects the IngotForge spelling and changes the plugin folder, main
PHP filename and text domain to ingotforge-opening-hours-indicator. The old schedules
table is atomically renamed with records, IDs and values retained. Version 2.1.1
removes misspelled prerelease aliases. Use the ingotforge_hours, ingotforge_schedule
and ingotforge_clock tags. The original business_status and opening_status tags 
remain supported. Replace retired shortcode names in existing content; retain the
same attributes and schedule IDs. No content is automatically rewritten. Follow 
Installation; do not activate two copies or uninstall the old copy. Custom PHP integrations
using the removed three-letter global OHI constants/functions/classes must use the
documented replacements below.

### Does the plugin need a time API to calculate opening hours?

No. It uses your server clock and the selected business timezone. Named timezones
follow PHP’s installed timezone rules. An optional clock API supplies a cached UTC
clock correction; the plugin still converts to the business timezone locally. Keep
the host clock accurate.

### How do overnight and 24-hour schedules work?

18:00-02:00 starts in the evening and closes the following morning. Equal start/
end values, such as 00:00-00:00, represent 24 hours from that day’s start. Blank
intervals mean closed. Opening is inclusive and closing is exclusive.

A holiday closes the receiving local day at midnight, including incoming overnight
hours. A date exception replaces the whole date; an explicit open exception can 
open a holiday. An active force-open/closed override has the highest priority.

### How do I add a holiday manually, including one missing from an API?

Open Opening Hours, edit the schedule and select Add a manual holiday. The Manual
holidays & closures section is always visible. Choose the complete date, leave repeat
unchecked for a one-year holiday, select Add holiday / closure and then Save schedule.
Any date left in the picker is also included on save, even without JavaScript.

The existing list also accepts one YYYY-MM-DD date per line, or MM-DD for an annual
closure. Remove a closure by deleting its line and saving. Moving holidays such 
as Divali need a separate dated entry each year. Add an observed closure day separately
when applicable; the manual list does not infer substitute holidays.

Manual closures supplement service holidays and are not erased by service refreshes.
An active Force open override or date-specific opening hours still take priority.
To open during a service holiday, use Date-specific hours under Special hours & 
temporary override.

### How are API errors handled?

The last valid holiday cache is retained only within its provider-specific storage
limit. Error responses do not overwrite good data. When there is no valid holiday
coverage, choose either normal weekly hours or closed. Manual closures remain effective.
Stale clock corrections expire and the display falls back to the server clock.

### Are all free APIs suitable for a commercial website?

No. Some are free only for evaluation/non-commercial use, some require sponsorship,
and some prohibit storage on entry-level plans. API Ninjas requires confirmation
of an eligible caching/storage plan. Abstract’s free daily response does not supply
a full holiday year. Review the current terms of your chosen service.

### Does the plugin disclose API keys to visitors?

Keys are stored server-side, encrypted when supported, and excluded from HTML, public
REST responses and exports. A blank password field preserves a saved key. Changing
the provider or custom endpoint clears its old key to prevent forwarding it elsewhere.
Re-enter keys after changing WordPress salts or moving to a site with different 
salts. This protects database-only copies, not an attacker controlling WordPress,
its salts or the host.

### Does live output work with caching?

The first result is server-rendered. Visible pages refresh status from your site’s
read-only REST endpoint about every 30 seconds, with backoff after errors. A clock
ticks locally without per-second HTTP calls. Exclude the status endpoint from CDN/
full-page caching. With JavaScript disabled or REST blocked, the initial cached 
page can be stale.

### What does the weekly timetable show?

Regular weekly intervals, not a date-specific holiday calendar. Its note states 
that holiday closures and special dated hours can differ. Next-change predictions
look ahead approximately 14 days using available rules and cached dates; they are
not reliable predictions of unavailable future holiday data.

### Can I export and import settings?

Tools & data exports schedules without credentials or service caches. Import accepts
the plugin’s JSON format, up to 200 schedules and 1 MB, validates all records before
inserting them, and assigns new IDs without overwriting existing records. Imported
schedules have external requests disabled and keys removed. Copy the new shortcode
IDs after import.

### What happens when I deactivate or uninstall?

Deactivation stops refresh jobs and clears remote service caches while retaining
schedules and keys. Uninstall retains schedule records by default but clears remote
caches. To remove schedule records too, explicitly enable deletion in Tools & data
before uninstalling. This preference is per site on multisite. Backups and provider-
side logs are outside the plugin’s deletion control.

### Can I downgrade?

Restore a pre-upgrade database and file backup for a full downgrade. Version 2.0.
x uses the previous table name; version 1.x also cannot understand multiple intervals,
extra settings or encrypted keys. Replacing plugin files alone is not a safe downgrade.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“IngotForge Opening Hours Indicator” is open source software. The following people
have contributed to this plugin.

Contributors

 *   [ ingotpress ](https://profiles.wordpress.org/ingotpress/)

[Translate “IngotForge Opening Hours Indicator” into your language.](https://translate.wordpress.org/projects/wp-plugins/ingotforge-opening-hours-indicator)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/ingotforge-opening-hours-indicator/),
check out the [SVN repository](https://plugins.svn.wordpress.org/ingotforge-opening-hours-indicator/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/ingotforge-opening-hours-indicator/)
by [RSS](https://plugins.trac.wordpress.org/log/ingotforge-opening-hours-indicator/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 2.1.1

 * Removed misspelled prerelease shortcode, PHP namespace, REST route, browser event,
   admin-page and import-format aliases; only the correct IngotForge identifiers
   are used.
 * Corrected timetable and clock shortcode attribute-filter names.
 * Updated the manual, migration guidance and translation template; documented existing-
   content and old-export adjustments.
 * Preserved scheduling, manual holiday controls, current data storage, credentials,
   service adapters, styles and original business_status/opening_status support.

#### 2.1.0

 * Corrected IngotForge branding, submission folder/main filename, text domain, 
   translation template and new shortcode/REST/event names; retained prior public
   aliases.
 * Replaced short global identifiers and transient names; safely renamed the schedule
   table with failure/conflict guards and preserved record IDs, values and credential
   encoding.
 * Preserved manual holiday entry, scheduling, styles, tutorial tabs, import/export
   and response adapters.
 * Removed automatic undocumented Enrico hosting; Enrico, HolidayAPI and TimeAPI
   protocols now use explicitly configured endpoints and operator-policy confirmation.
   No invented policy URLs are bundled.
 * Added preset terms/privacy links, custom operator-policy fields, migration notices
   and complete upgrade instructions. No CDN dependency was added.

#### 2.0.5

 * Shorten the 2.0.4 and 2.0.3 upgrade notices to fit the 300-character limit; keep
   the full migration instructions under Installation.
 * Add a short upgrade notice for this maintenance release and synchronize the release
   metadata.
 * Retain the existing Tested up to header and validation-scope disclosure, submission
   identity, translations and all runtime functionality.

#### 2.0.4

 * Add the missing Tested up to header for the WordPress 7.1 compatibility target,
   with explicit validation-scope disclosure.
 * Synchronize the release version, Stable tag and translation-template project 
   metadata.
 * Preserve the aligned plugin identity, all existing runtime functionality, manual
   holiday controls, service adapters, administration manual, stored data and frontend
   assets.
 * Clarify the update path from the already branded folder versus the older opening-
   hours-indicator folder.

#### 2.0.3

 * Align the package folder, main PHP filename, text domain and POT metadata with
   the proposed ingotforge-opening-hours-indicator submission slug.
 * Update the local manual and installation instructions for a safe one-time folder
   transition without uninstalling shared schedule data.
 * Retain schedule calculations, manual holiday controls, provider adapters, stored
   IDs/settings/credentials, shortcodes, hooks, admin page links and all JavaScript/
   CSS.
 * This older package omitted the Tested up to header; the omission is addressed
   in 2.0.4. The testing metadata is retained in later releases.

#### 2.0.2

 * Make nonce verification explicit in every administrator command while retaining
   existing form actions and nonce names.
 * Prefix administration-template and bootstrap variables without changing the rendered
   interface.
 * Cache paginated schedule reads and counts; invalidate row and query caches after
   saves, deletes, imports, migrations and service-cache changes.
 * Clear persistent row and option caches during uninstall without changing the 
   default data-retention choice.
 * Document necessary custom-table, read-only navigation and legacy-compatibility
   exceptions narrowly in the source.
 * Retain the 2.0.1 manual-holiday picker, editable dates, annual closures, existing
   shortcodes, rendering, styling and integration adapters.

#### 2.0.1

 * Made manual holiday closures a permanently visible editor section, with an Add
   a manual holiday shortcut.
 * Added a date picker, Add holiday / closure button, duplicate prevention and optional
   annual recurrence.
 * Preserved direct date-list editing and added server-side handling for a pending
   date, including when JavaScript is disabled.
 * Added a manual-holiday tutorial and explicit guidance about moving holidays, 
   observed dates and existing override priorities.
 * Retained the existing holiday_dates storage, database schema, shortcodes, frontend
   rendering and provider integrations.

#### 2.0.0

 * Renamed the display name to IngotForge Opening Hours Indicator while preserving
   the existing plugin basename, table, IDs and shortcodes.
 * Retained all original schedule, holiday, label, prefix/postfix and typography/
   color controls.
 * Added split shifts, date exceptions, annual closures, overrides, next-change 
   output, timetable and clock shortcodes.
 * Corrected overnight previous-day evaluation and the nested legacy holiday cache.
 * Updated provider contracts and added holiday/clock/custom JSON adapters, explicit
   plan disclosures and protected credentials.
 * Added server-only cached integrations, timeouts, response validation, error backoff
   and provider-specific retention safeguards.
 * Rebuilt the local responsive admin editor, tutorials, service directory, import/
   export and retention controls.
 * Added public/private visibility, same-site live updates and conditional scoped
   assets without external CDNs.
 * Improved request authorization, validation, output escaping and non-destructive
   upgrades.

#### 1.2.1

 * Original uploaded Opening Hours Indicator baseline. No earlier change history
   was supplied in the source archive.

## Meta

 *  Version **2.1.1**
 *  Last updated **18 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.2 or higher **
 *  Tested up to **7.1.3**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [business hours](https://wordpress.org/plugins/tags/business-hours/)[clock](https://wordpress.org/plugins/tags/clock/)
   [holiday](https://wordpress.org/plugins/tags/holiday/)[Opening Hours](https://wordpress.org/plugins/tags/opening-hours/)
   [timezone](https://wordpress.org/plugins/tags/timezone/)
 *  [Advanced View](https://wordpress.org/plugins/ingotforge-opening-hours-indicator/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/ingotforge-opening-hours-indicator/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/ingotforge-opening-hours-indicator/reviews/)

## Contributors

 *   [ ingotpress ](https://profiles.wordpress.org/ingotpress/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/ingotforge-opening-hours-indicator/)

## Donate

Would you like to support the advancement of this plugin?

 [ Donate to this plugin ](https://ingotforge.wordpress.com)