Skip to content

Frontend fatal when Business Hours CSS autoload file is unavailable #2973

Description

@pirate-bot

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

  1. Use Otter Pro 3.2.2 with an active Pro license so the Business Hours CSS handler is registered.
  2. Make the mapped class-business-hours-css.php file unavailable or unreadable in the deployed Pro package.
  3. 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.phpAutoloader::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.phpAutoloader::require_file() lines 141-150 unconditionally executes require $file, despite its docblock describing an existence result.
  • plugins/otter-pro/inc/class-main.phpMain::register_blocks_css() lines 159-171 appends Business_Hours_CSS when the Pro license is active.
  • inc/class-base-css.phpBase_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.phpBlock_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.phpBusiness_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)

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions