Summary
Otter Pro can terminate a frontend request while loading global styles when the Business Hours CSS class file is unavailable.
Expected behavior: The frontend remains available when an optional mapped CSS class file cannot be loaded.
Actual behavior: The request ends with Failed opening required .../class-business-hours-css.php.
Impact: Affected pages cannot render for the affected installation.
Customer context
- Product / area: Otter Pro, frontend global styles
- Version: 3.2.2
- Environment: WordPress 7.0.3 and 7.0.4; PHP 8.3.31 and 8.4.21
- Integration / third party: Not applicable
- Reported error / symptom:
Failed opening required .../class-business-hours-css.php
- Impact: Two telemetry occurrences across two distinct production sites between 2026-08-12 13:47 UTC and 14:54 UTC.
Reproduction notes
- Use Otter Pro 3.2.2 with an active Pro license so the Business Hours CSS handler is registered.
- Make the mapped
class-business-hours-css.php file unavailable or unreadable in the deployed Pro package.
- Load a frontend request that enqueues Otter global styles.
Observed in production: the request failed at the Business Hours CSS autoload step. Local reproduction status: not run; the inspected v3.2.2 source contains the file.
Diagnosis
Conclusion
Production telemetry captures an uncaught frontend error while Otter Pro loads Business_Hours_CSS. The Pro autoloader performs an unconditional require for its mapped class path, so an unavailable file terminates the request. This fatal behavior is confirmed by the stack trace and source inspection.
The expected source file is present and tracked in the v3.2.2 tree. This indicates that the production file was missing or unreadable in the affected deployment; the supplied evidence does not distinguish those two conditions.
Where this likely occurs
plugins/otter-pro/autoloader.php — Autoloader::load_mapped_file() lines 108-134 converts ThemeIsle\OtterPro\CSS\Blocks\Business_Hours_CSS to the mapped PHP path and calls require_file().
plugins/otter-pro/autoloader.php — Autoloader::require_file() lines 141-150 unconditionally executes require $file, despite its docblock describing an existence result.
plugins/otter-pro/inc/class-main.php — Main::register_blocks_css() lines 159-171 appends Business_Hours_CSS when the Pro license is active.
inc/class-base-css.php — Base_CSS::cycle_through_global_styles() lines 637-645 instantiates each registered CSS class; this is the reported trigger at line 640.
inc/css/class-block-frontend.php — Block_Frontend::enqueue_global_styles() approx. lines 656-668 invokes the global-style cycle on the frontend.
plugins/otter-pro/inc/css/blocks/class-business-hours-css.php — Business_Hours_CSS lines 8-24 exists in release tag v3.2.2 (27858f6e), matching the requested class and mapped filename.
bin/dist.sh lines 43-70 packages the Pro directory separately, including its PHP source before moving Pro build assets.
Engineering notes
- The telemetry reports this outside the Themeisle SDK, and the inspected code is in the Otter Blocks monorepo's bundled Pro plugin. The issue routes to
Codeinwp/otter-blocks.
- The observed path is reached only after the active-license filter adds the Pro CSS handlers, then during frontend global-style generation.
- The mapped class-to-file transformation matches the checked-in
class-business-hours-css.php path for the inspected release. The evidence suggests an artifact integrity or filesystem-readability condition, but does not establish which condition occurred on either production site.
- The trace contains no customer-identifying data and does not demonstrate behavior for CSS classes other than Business Hours.
Test coverage status
tests/test-registration.php lines 137-156 and 197-216 cover a missing dynamic block renderer in registration. They do not exercise Autoloader::require_file(), Business_Hours_CSS, otter_blocks_register_css, Base_CSS::cycle_through_global_styles(), or the Pro distribution artifact. No relevant coverage was found during inspection for this autoload failure path.
What to verify or explore next
- May be worth reproducing a frontend global-style request with the mapped Business Hours CSS file unavailable or unreadable in an Otter Pro 3.2.2 package.
- Check the generated
otter-pro release artifact used by affected installations for inc/css/blocks/class-business-hours-css.php and its filesystem readability.
- Run the relevant PHP test suite after adding or locating coverage for the Pro autoloader and global-style instantiation path.
- Confirm whether other Pro CSS handler files exhibit the same artifact or readability condition.
Unknowns / follow-up
- The telemetry path is redacted, so the deployed artifact location cannot be compared directly with the release archive.
- No local runtime reproduction was performed because the checked-out
v3.2.2 source contains the expected file.
- It is unknown whether the affected installations were updated through the same delivery channel or had altered plugin files.
Confidence
Confidence: 92/100
Production telemetry records the same Otter Pro 3.2.2 frontend fatal on two sites, and the traced custom autoloader directly performs an unconditional require for the mapped Business Hours CSS file. The release source contains the expected file, narrowing the observed failure to a missing or unreadable deployed artifact that the product path turns into a frontend crash.
Crash telemetry
|
|
| Occurrences |
2 |
| Distinct sites |
2 |
| First seen |
2026-08-12 13:47 UTC |
| Last seen |
2026-08-12 14:54 UTC |
| Crash location |
product:autoloader.php:148 |
| Request context |
frontend |
| Inside Themeisle SDK |
no |
| Product versions |
3.2.2 |
| WP versions |
7.0.3, 7.0.4 |
| PHP versions |
8.3.31, 8.4.21 |
| SDK versions |
3.3.59 |
Source: automated crash report — otter-pro, fingerprint 55bc637d4f5e00cbbf729f68062ed480
Generated by bug-report-triage (ID: bug-report-triage_6a7d5d85c7bcc0.36696990)
Summary
Otter Pro can terminate a frontend request while loading global styles when the Business Hours CSS class file is unavailable.
Expected behavior: The frontend remains available when an optional mapped CSS class file cannot be loaded.
Actual behavior: The request ends with
Failed opening required .../class-business-hours-css.php.Impact: Affected pages cannot render for the affected installation.
Customer context
Failed opening required .../class-business-hours-css.phpReproduction notes
class-business-hours-css.phpfile unavailable or unreadable in the deployed Pro package.Observed in production: the request failed at the Business Hours CSS autoload step. Local reproduction status: not run; the inspected
v3.2.2source contains the file.Diagnosis
Conclusion
Production telemetry captures an uncaught frontend error while Otter Pro loads
Business_Hours_CSS. The Pro autoloader performs an unconditionalrequirefor its mapped class path, so an unavailable file terminates the request. This fatal behavior is confirmed by the stack trace and source inspection.The expected source file is present and tracked in the
v3.2.2tree. This indicates that the production file was missing or unreadable in the affected deployment; the supplied evidence does not distinguish those two conditions.Where this likely occurs
plugins/otter-pro/autoloader.php—Autoloader::load_mapped_file()lines 108-134 convertsThemeIsle\OtterPro\CSS\Blocks\Business_Hours_CSSto the mapped PHP path and callsrequire_file().plugins/otter-pro/autoloader.php—Autoloader::require_file()lines 141-150 unconditionally executesrequire $file, despite its docblock describing an existence result.plugins/otter-pro/inc/class-main.php—Main::register_blocks_css()lines 159-171 appendsBusiness_Hours_CSSwhen the Pro license is active.inc/class-base-css.php—Base_CSS::cycle_through_global_styles()lines 637-645 instantiates each registered CSS class; this is the reported trigger at line 640.inc/css/class-block-frontend.php—Block_Frontend::enqueue_global_styles()approx. lines 656-668 invokes the global-style cycle on the frontend.plugins/otter-pro/inc/css/blocks/class-business-hours-css.php—Business_Hours_CSSlines 8-24 exists in release tagv3.2.2(27858f6e), matching the requested class and mapped filename.bin/dist.shlines 43-70 packages the Pro directory separately, including its PHP source before moving Pro build assets.Engineering notes
Codeinwp/otter-blocks.class-business-hours-css.phppath for the inspected release. The evidence suggests an artifact integrity or filesystem-readability condition, but does not establish which condition occurred on either production site.Test coverage status
tests/test-registration.phplines 137-156 and 197-216 cover a missing dynamic block renderer in registration. They do not exerciseAutoloader::require_file(),Business_Hours_CSS,otter_blocks_register_css,Base_CSS::cycle_through_global_styles(), or the Pro distribution artifact. No relevant coverage was found during inspection for this autoload failure path.What to verify or explore next
otter-prorelease artifact used by affected installations forinc/css/blocks/class-business-hours-css.phpand its filesystem readability.Unknowns / follow-up
v3.2.2source contains the expected file.Confidence
Confidence: 92/100
Production telemetry records the same Otter Pro 3.2.2 frontend fatal on two sites, and the traced custom autoloader directly performs an unconditional
requirefor the mapped Business Hours CSS file. The release source contains the expected file, narrowing the observed failure to a missing or unreadable deployed artifact that the product path turns into a frontend crash.Crash telemetry
product:autoloader.php:148Source: automated crash report — otter-pro, fingerprint
55bc637d4f5e00cbbf729f68062ed480Generated by bug-report-triage (ID: bug-report-triage_6a7d5d85c7bcc0.36696990)