{"id":370692,"date":"2026-09-21T12:11:17","date_gmt":"2026-09-21T12:11:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/be-right-back\/"},"modified":"2026-09-22T16:01:40","modified_gmt":"2026-09-22T16:01:40","slug":"offair","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/offair\/","author":23567996,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.1.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Offair - Branded Error Pages","header_author":"Nolidev","header_description":"Branded pages for the screens WordPress shows by itself when it breaks: database connection errors, fatal PHP errors and the update notice. Works even when WordPress cannot load.","assets_banners_color":"cacac9","last_updated":"2026-09-22 16:01:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/nolidev-fr\/offair","header_author_uri":"https:\/\/nolidev.fr","rating":0,"author_block_rating":0,"active_installs":10,"downloads":179,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"nolidev","date":"2026-09-21 12:11:08","revision":3705560},"1.0.1":{"tag":"1.0.1","author":"nolidev","date":"2026-09-21 13:37:26","revision":3705681},"1.0.2":{"tag":"1.0.2","author":"nolidev","date":"2026-09-21 13:53:48","revision":3705698},"1.0.3":{"tag":"1.0.3","author":"nolidev","date":"2026-09-22 02:37:55","revision":3706530},"1.1.0":{"tag":"1.1.0","author":"nolidev","date":"2026-09-22 16:01:40","revision":3707711}},"upgrade_notice":{"1.1.0":"<p>Email alert, outage history, theme templates, four layouts, dark mode and a page per site on networks. The pages now follow the dark mode of visitors: choose Always light to keep them light. If you uploaded the drop-ins yourself, download them again.<\/p>","1.0.3":"<p>Fixes AVIF logos missing from the pages and stops the PHP error page from reloading itself every minute.<\/p>","1.0.2":"<p>The pages are brought up to date right after an update, even when nobody opens the admin.<\/p>","1.0.1":"<p>Fixes heavy SVG logos missing from the pages, makes the button easier to read on mid-tone colors and adds a button text color setting.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3705560,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3705560,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3705560,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3705560,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3705560,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3705560,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3705560,"resolution":"2","location":"assets","locale":"","width":1280,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3705560,"resolution":"3","location":"assets","locale":"","width":1280,"height":900}},"screenshots":{"1":"The database error page as visitors see it: logo, message, retry button and incident line.","2":"The settings page: state of the three pages, logo, colors and fonts.","3":"One tab per page, with the live preview rendered exactly as visitors will see it."}},"plugin_section":[],"plugin_tags":[14908,153,49036,970,22682],"plugin_category":[59],"plugin_contributors":[281835],"plugin_business_model":[],"class_list":["post-370692","plugin","type-plugin","status-publish","hentry","plugin_tags-14908","plugin_tags-database","plugin_tags-downtime","plugin_tags-error-page","plugin_tags-fatal-error","plugin_category-utilities-and-tools","plugin_contributors-nolidev","plugin_committers-nolidev"],"banners":{"banner":"https:\/\/ps.w.org\/offair\/assets\/banner-772x250.png?rev=3705560","banner_2x":"https:\/\/ps.w.org\/offair\/assets\/banner-1544x500.png?rev=3705560","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/offair\/assets\/icon.svg?rev=3705560","icon":"https:\/\/ps.w.org\/offair\/assets\/icon.svg?rev=3705560","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/offair\/assets\/screenshot-1.png?rev=3705560","caption":"The database error page as visitors see it: logo, message, retry button and incident line."},{"src":"https:\/\/ps.w.org\/offair\/assets\/screenshot-2.png?rev=3705560","caption":"The settings page: state of the three pages, logo, colors and fonts."},{"src":"https:\/\/ps.w.org\/offair\/assets\/screenshot-3.png?rev=3705560","caption":"One tab per page, with the live preview rendered exactly as visitors will see it."}],"raw_content":"<!--section=description-->\n<p>When WordPress breaks, it shows screens of its own that no theme and no plugin can style, because they appear before any of them is loaded:<\/p>\n\n<ul>\n<li><strong>Error establishing a database connection<\/strong>, when the database is unreachable.<\/li>\n<li><strong>Briefly unavailable for scheduled maintenance<\/strong>, while WordPress installs updates.<\/li>\n<li><strong>There has been a critical error on this website<\/strong>, after a fatal PHP error.<\/li>\n<\/ul>\n\n<p>Offair replaces these three screens with a calm page in your colors, with your logo and your words, and makes them answer with the right HTTP status so that search engines and caches treat the outage as temporary.<\/p>\n\n<p>It also keeps a history of the outages your visitors ran into, and can email you when the database goes down, then again once the site is back.<\/p>\n\n<p>This is not a maintenance mode or coming soon plugin. It does not take your site offline and it does not add a page you switch on. It only covers the moments when WordPress itself cannot serve your site.<\/p>\n\n<h4>How it works<\/h4>\n\n<p>WordPress looks for three special files in <code>wp-content<\/code>, called drop-ins: <code>db-error.php<\/code>, <code>maintenance.php<\/code> and <code>php-error.php<\/code>. It loads them itself, before any plugin, which is the only way to show something when the database is down.<\/p>\n\n<p>The plugin copies one static file shipped in its own folder (<code>dropins\/drop-in.php<\/code>) under these three names. No code is generated. The content of the pages (texts, colors, logo) is saved as a JSON file in <code>wp-content\/uploads\/offair\/<\/code>, and the drop-in reads it when a page has to be shown. What visitors must not see, such as the alert recipient and the history, is kept next to it in a private folder whose name cannot be guessed.<\/p>\n\n<h4>What you get<\/h4>\n\n<ul>\n<li>Four layouts for the three screens: card, minimal, two columns or banner. Each shows the logo, the site name, the title, the message, a retry button and an incident line with the local time.<\/li>\n<li>Automatic dark mode: the pages follow the light or dark setting of the device of the visitor, with an optional logo for dark backgrounds. They can also stay always light or always dark.<\/li>\n<li>Your logo and colors, detected from the theme, the site icon and Elementor global colors when available, editable at any time.<\/li>\n<li>Texts in the language of the site until you customize them. French translation included.<\/li>\n<li>Correct HTTP answers: 503 with a Retry-After header for the database and update pages, 503 or 500 for PHP errors (your choice), plus no-cache headers so no cache ever keeps an error page.<\/li>\n<li>No external dependency: system fonts, logo embedded in the content file, nothing loaded from the network.<\/li>\n<li>A live preview of each page, rendered by the drop-in itself, exactly as visitors will see it.<\/li>\n<li>An email alert when the database goes down, off by default. The page itself sends it while WordPress cannot run, and WordPress sends a report once the site is back, with the duration of the outage. A test button shows whether your host delivers it.<\/li>\n<li>A history of the outages, in its own tab: the date, the page and the HTTP status, recorded once a minute at most. Nothing about your visitors is recorded. A notice on the dashboard tells you about a database outage you missed.<\/li>\n<li>Theme templates: a theme can design any of the three pages itself, with the texts, colors and logo from the settings.<\/li>\n<li>A status box, a Site Health test and WP-CLI commands.<\/li>\n<li>Clean removal: the drop-ins are removed when the plugin is deactivated, and everything is removed when it is uninstalled.<\/li>\n<\/ul>\n\n<p>The plugin never replaces a <code>db-error.php<\/code>, <code>maintenance.php<\/code> or <code>php-error.php<\/code> it did not add itself. If one already exists, it tells you and waits for your decision.<\/p>\n\n<h4>Developers<\/h4>\n\n<ul>\n<li><code>offair_settings<\/code> filters the settings before the page content is built.<\/li>\n<li><code>offair_data<\/code> filters the page content before it is saved for the drop-in.<\/li>\n<li><code>offair_incident_resolved<\/code> fires once a database outage is over, with the times of the first and last pages shown.<\/li>\n<li>Theme templates: <code>offair\/db-error.php<\/code>, <code>offair\/maintenance.php<\/code> and <code>offair\/php-error.php<\/code> in the active theme or its parent. The variables they receive are listed in the <a href=\"https:\/\/github.com\/nolidev-fr\/offair#theme-templates\">documentation on GitHub<\/a>.<\/li>\n<li>WP-CLI: <code>wp offair status<\/code>, <code>generate [--force]<\/code>, <code>remove [--force]<\/code>, <code>preview &lt;db|maintenance|php&gt;<\/code>, <code>history<\/code>.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin from Plugins, Add New.<\/li>\n<li>Open Settings, Offair. The logo and primary color of your site are pre-filled when they can be detected.<\/li>\n<li>Adjust the texts and colors, save. The preview shows the result.<\/li>\n<\/ol>\n\n<p>On activation the plugin copies its drop-in to <code>wp-content<\/code> under the three names WordPress expects, and saves the page content in <code>wp-content\/uploads\/offair\/<\/code>. If <code>wp-content<\/code> is not writable, download the drop-ins from the settings page and upload them yourself, once.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20a%20maintenance%20mode%20plugin%3F\"><h3>Is this a maintenance mode plugin?<\/h3><\/dt>\n<dd><p>No. It does not let you put your site offline. It styles the screens WordPress shows on its own when the database is down, while updates are installed and after a fatal error. It works alongside any maintenance mode or coming soon plugin.<\/p><\/dd>\n<dt id=\"why%20does%20the%20plugin%20add%20files%20to%20wp-content%3F\"><h3>Why does the plugin add files to wp-content?<\/h3><\/dt>\n<dd><p>Because WordPress only looks for these drop-ins there, and loads them before any plugin. That is the only way to show a page when the database is down. The three files are identical copies of <code>dropins\/drop-in.php<\/code> from the plugin folder. They are removed when the plugin is deactivated or uninstalled.<\/p><\/dd>\n<dt id=\"why%20is%20the%20content%20saved%20as%20a%20file%20and%20not%20in%20the%20database%3F\"><h3>Why is the content saved as a file and not in the database?<\/h3><\/dt>\n<dd><p>The database is precisely what may be unreachable when the page is shown. The content is saved in the uploads folder, in <code>offair\/pages.json<\/code>, and contains only what the visitors see on the page. The alert settings and the history are kept in a private folder next to it.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20caching%20%28litespeed%20cache%2C%20wp%20rocket%2C%20cloudflare%29%3F\"><h3>Does it work with page caching (LiteSpeed Cache, WP Rocket, Cloudflare)?<\/h3><\/dt>\n<dd><p>Yes. Pages already in the cache keep being served normally during an outage, which is what you want. Only requests that reach PHP see the outage page, and that page is sent with headers that prevent it from being cached.<\/p><\/dd>\n<dt id=\"does%20it%20cover%20a%20web%20server%20or%20php%20outage%3F\"><h3>Does it cover a web server or PHP outage?<\/h3><\/dt>\n<dd><p>No. If the web server or PHP itself is down, nothing on the site can run. Only your host can show a page in that case.<\/p><\/dd>\n<dt id=\"the%20status%20box%20says%20a%20file%20was%20not%20added%20by%20the%20plugin.\"><h3>The status box says a file was not added by the plugin.<\/h3><\/dt>\n<dd><p>Another plugin or a person placed a file with the same name in <code>wp-content<\/code>. The plugin leaves it untouched. Open the Advanced tab to replace it if you want to.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20need%20output%20buffering%20in%20php%3F\"><h3>Does the plugin need output buffering in PHP?<\/h3><\/dt>\n<dd><p>No. The database and update pages never depend on it, and the PHP error page works without it as long as PHP does not print errors on screen, which is the normal configuration of a live site.<\/p>\n\n<p>There is one combination WordPress cannot handle: errors printed on screen (usually because WP_DEBUG and WP_DEBUG_DISPLAY are enabled) together with output buffering off. PHP then sends the raw error and the headers before WordPress runs its handler, so no error page, branded or not, can be shown. The settings page and Site Health detect this combination and explain the two fixes: disable WP_DEBUG_DISPLAY on a live site, or set output_buffering to 4096 in the PHP configuration.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20emails%20or%20contact%20any%20service%3F\"><h3>Does the plugin send emails or contact any service?<\/h3><\/dt>\n<dd><p>Only if you turn on the email alert, and only to the address you choose. The alert is sent by your own server. Nothing else leaves it: there is no tracking, no update check and no external asset.<\/p><\/dd>\n<dt id=\"why%20does%20the%20alert%20sometimes%20not%20arrive%3F\"><h3>Why does the alert sometimes not arrive?<\/h3><\/dt>\n<dd><p>While the database is down WordPress cannot run, so the alert is sent with the mail function of PHP, not through your email plugin. Some hosts block it and some inboxes file it as spam. Use the test button in the Database error tab: the test travels exactly the same way. The report sent once the site is back goes through WordPress, like your other emails. It leaves once the error page has not been shown for five minutes, at the next scheduled check or as soon as someone opens the admin.<\/p><\/dd>\n<dt id=\"what%20does%20the%20history%20record%3F\"><h3>What does the history record?<\/h3><\/dt>\n<dd><p>The date, the page and the HTTP status, once a minute at most, each time a visitor sees one of the pages. Nothing about the visitors themselves. The history is kept for 180 days and removed when the plugin is uninstalled. An outage while nobody visits the site cannot be seen.<\/p><\/dd>\n<dt id=\"can%20my%20theme%20design%20the%20pages%3F\"><h3>Can my theme design the pages?<\/h3><\/dt>\n<dd><p>Yes. Add <code>offair\/db-error.php<\/code>, <code>offair\/maintenance.php<\/code> or <code>offair\/php-error.php<\/code> to your theme or child theme. The page then uses your template instead of the built-in one. It receives the texts, colors and logo from the settings, the built-in markup and an escaping function. WordPress is not loaded when these pages are shown, so a template can only use plain PHP. If a template fails, the built-in page is shown instead.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20multisite%3F\"><h3>Does it work on multisite?<\/h3><\/dt>\n<dd><p>Yes. The drop-ins are shared by every site of the network, so the settings live in the network admin under Settings, Offair. Each site still gets its own page, found from the address the visitor asked for: its title, its logo or site icon, its language, its timezone and the templates of its own theme. The design, the colors and the texts are shared by the network.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: email alert when the database goes down, and a report once the site is back. Off by default, with a test button.<\/li>\n<li>New: history of the pages shown to visitors, in a new History tab, and a dashboard notice after a database outage.<\/li>\n<li>New: theme templates. A theme can replace any of the three pages with its own design.<\/li>\n<li>New: four layouts: card, minimal, two columns and banner.<\/li>\n<li>New: automatic dark mode, with an optional logo for dark backgrounds. The pages can also stay always light or always dark.<\/li>\n<li>New: on a network, each site gets its own page, with its title, logo, language, timezone and theme templates.<\/li>\n<li>New: <code>offair_incident_resolved<\/code> action and <code>wp offair history<\/code> command.<\/li>\n<li>Fix: a site icon in a format the pages cannot show, such as AVIF, was left out of the pages. It is now embedded as PNG.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fix: a logo in a format the pages cannot show, such as AVIF, was left out without any warning. It is now embedded as PNG.<\/li>\n<li>The PHP error page no longer reloads itself every minute by default: a fatal error rarely clears on its own, and each reload runs into it again. Sites that kept the former default switch to no reload, a delay set by hand is kept.<\/li>\n<li>When the automatic refresh is turned off, the page no longer says that it refreshes on its own.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>After an update, the pages are brought up to date on the first request, without waiting for someone to open the admin.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: an SVG logo over 150 KB that only wraps one image, as design tools export them, was left out of the pages. The image is now taken out and resized like any other logo.<\/li>\n<li>New: optional button text color. Left empty, the choice stays automatic.<\/li>\n<li>The automatic button text is now white on mid-tone colors, with the button slightly darkened when needed, instead of dark text that was hard to read. The label always reaches a 4.5:1 contrast.<\/li>\n<li>The settings page warns when the chosen logo cannot be embedded.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: branded pages for database connection errors, the update notice and fatal PHP errors.<\/li>\n<li>Settings page with status box, live preview, manual download and per-page options.<\/li>\n<li>Logo and color detection, texts in the language of the site, French translation.<\/li>\n<li>Site Health test and WP-CLI commands.<\/li>\n<\/ul>","raw_excerpt":"Branded pages for the screens WordPress shows when it breaks: database connection errors, fatal PHP errors and the update notice.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/370692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=370692"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/nolidev"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=370692"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=370692"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=370692"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=370692"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=370692"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=370692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}