Limbus Maintenance Page & Shop Pause

Description

This plugin has two switches. One closes the site behind a maintenance page. One stops ordering in a WooCommerce shop while the catalogue stays open.

One page, four uses. The same page serves as a maintenance page during an update, a coming soon page before launch, an under construction notice while you build, and a private screen while you work on a staging copy. You set a title and a message.

Maintenance mode. A single on/off switch that saves as soon as you flip it. Visitors get the page; everything else on the screen is optional.

Shop pause. For holidays and stock takes. The catalogue stays browsable and indexed, ordering stops: nobody can add to cart or reach checkout, while customers who already ordered still reach their confirmation and pay-for-order pages. Set a start and an end date and the shop reopens on its own.

How it works

  • HTTP 503 with a Retry-After header. A 503 tells search engines the outage is temporary and that your existing pages should stay indexed. When you set an end time, Retry-After is calculated from it. No noindex header is ever sent.
  • The maintenance page is self-contained. One HTML document of about 2 KB with its styles inline: no external stylesheet, no web font, no script, no tracker. It renders even when the rest of the site cannot.
  • Fonts already on the visitor’s device. Choose a system font, sans-serif, serif, or serif headings with sans-serif text; no font file is requested. If your theme declares its typography in theme.json, a Match my theme option appears as well. Classic themes keep their fonts in a stylesheet, which cannot be read from a plugin, so the option is hidden rather than shown doing nothing.
  • PHP notices are kept out of the page. With WP_DEBUG on, a notice or deprecation raised anywhere during the request would otherwise be printed into the response. The 503 response is the document and nothing else. Your error log still receives everything.
  • The shop pause filters purchasability instead of hiding buttons, which is what the classic templates, the Cart and Checkout blocks and the Store API all read. HPOS and Cart/Checkout Blocks compatibility are declared.
  • Page caches are emptied when you flip a switch. WP Rocket, LiteSpeed, W3 Total Cache, WP Super Cache, Cache Enabler, Autoptimize, SiteGround Optimizer, Hummingbird and Breeze store finished HTML and serve it from a drop-in that runs before plugins load, so the cache is cleared automatically — and only when a switch or a schedule changes, so editing a message does not flush a large site.
  • Schedules are evaluated on each request rather than through WP-Cron, which needs traffic to fire.
  • Text colour is derived from the background using WCAG relative luminance, and the contrast ratio is shown live if you set the colour yourself.

What it does not do

  • No admin notice outside its own settings screen: no review prompt, no banner, no countdown.
  • No telemetry, no analytics, no “help us improve” prompt.
  • No email of any kind.
  • No external service, account, API key or quota. Everything runs on your own server.
  • No arbitrary CSS, JavaScript or PHP is stored or executed. Developers can replace the page entirely through a filter, in their own code.
  • No front-end CSS or JavaScript file. The shop notice uses WooCommerce’s own notice class and inherits your theme’s styling.
  • No extra database query: one autoloaded option, already read by the time the plugin runs.
  • No table, no transient, no cron event. Deleting the plugin removes that single option, unless you ask it to keep your settings.
  • Nothing is registered on the front end while both modes are off.

Using it

  • While a mode is running, a red marker sits in the toolbar on every screen — Maintenance page active, Shop paused, or both — linking to the switch that turns it off.
  • With WooCommerce active, a Shop pause entry appears in the WooCommerce menu and opens the shop section of the settings.
  • A live preview sits beside the form and updates as you change the title, message, logo, colours or fonts. It is rendered by the plugin itself, so it matches what visitors get.
  • Both switches save on their own and report what happened, including which page cache was emptied. The remaining fields use the Save button.
  • A shareable preview link lets someone without an account see the site during maintenance. Opening it sets a cookie that lasts a month, and you can regenerate the link to revoke it.
  • An allowlist keeps chosen pages public. Search your own pages, posts and products by name and add them in a click, or type paths by hand: /blog/* keeps a whole section open, / keeps just the home page.
  • Choose who still sees the site: administrators, administrators and editors, or anyone logged in. The login page always stays reachable.
  • Deactivating the plugin turns both modes off and keeps your settings.
  • Settings export and import as plain JSON, for reusing the same setup across sites.

For developers

limbus_maintenance_page_shop_pause_bypass_maintenance (bool) — let a request through.
limbus_maintenance_page_shop_pause_maintenance_html (string|null) — replace the maintenance page entirely with your own markup.
limbus_maintenance_page_shop_pause_retry_after (int) — change the `Retry-After` value.
limbus_maintenance_page_shop_pause_purge_cache (action) — fired after the known page caches are cleared, for a server-level cache, Varnish or a CDN.
limbus_maintenance_page_shop_pause_clean_output (bool) — return false to let PHP notices through onto the maintenance page while debugging it.

Languages

The plugin is fully internationalised and follows each user’s own WordPress language, so two people on the same site can see it in two different languages. Right-to-left locales get a right-to-left layout, in the settings screen and on the maintenance page. Translations are managed on translate.wordpress.org and contributions are welcome there.

Privacy and external services

This plugin does not connect to any external service. It sends no data anywhere, sets no third-party cookie, loads no remote asset and collects no analytics. The only cookie it sets is on your own domain, when you open your own preview link, and it stores a hash rather than the key itself.

Credits

Developed and maintained by Stefanos Athanassopoulos at Limbus Studio, a French studio whose day job is looking after WordPress sites. It is the tool we wanted for our own maintenance windows and our clients’ WooCommerce holiday closures.

Screenshots

Installation

  1. Install and activate. Both switches start off, so activating the plugin does not take a site down.
  2. Go to Settings Maintenance Page.
  3. Flip Put the site in maintenance mode, or Pause ordering for the shop. The switches save themselves; the other fields use the Save button.

FAQ

Will maintenance mode hurt my search rankings?

Visitors get HTTP 503 with a Retry-After header, which tells search engines the outage is temporary and that your existing pages should stay indexed. If you set an end time, Retry-After is calculated from it. No noindex is sent.

Can I use it as a coming soon or under construction page?

Yes, it is the same switch. Set your title and message, turn it on, and the page stays up until you turn it off. Before a launch, when nothing is indexed yet, the 503 costs you nothing; on a site that is already live, it is what protects your rankings during an update.

I switched maintenance mode on, but my site is still up. Why?

Almost always a page cache. WP Rocket, LiteSpeed and the others store finished HTML and serve it from a drop-in that runs before any plugin loads, so visitors keep getting the stored pages. The plugin empties the caches it can detect each time you switch a mode, and the settings screen names the one it found. If your host or CDN adds its own cache — Varnish, nginx, Cloudflare — clear that one too, or hook onto limbus_maintenance_page_shop_pause_purge_cache to do it automatically.

A quick way to tell the difference: open a URL that cannot be cached, such as yoursite.com/a-page-that-does-not-exist/. If that returns the maintenance page, the plugin is working and only the cache is in the way.

Can I still work on the site while maintenance mode is on?

Yes. You stay logged in and see the site normally. You can widen that to editors, or to anyone with an account.

How do I show the site to a client who has no account?

Copy the preview link from the settings page and send it. Opening it sets a cookie that lasts a month. Generate a new link at any time to revoke the old one.

Can I add my own CSS to the maintenance page?

Not from the settings screen: the directory does not allow plugins to store arbitrary CSS. Developers can return their own markup from the limbus_maintenance_page_shop_pause_maintenance_html filter, in a theme or a site-specific plugin.

Does the shop pause empty my customers’ carts?

Products become non-purchasable while the pause is on, and WooCommerce removes non-purchasable items from carts when it validates them. For a planned closure this is the intended behaviour. Carts filled after the shop reopens are unaffected.

Can customers still reach their existing orders?

Yes. Order confirmation and pay-for-order pages stay reachable throughout, so anyone who ordered before the pause is not left stranded.

Does this work with block themes and the Cart and Checkout blocks?

Yes. The shop pause filters purchasability rather than hiding buttons, which the classic templates, the blocks and the Store API all read. HPOS and Cart/Checkout Blocks compatibility are both declared.

Do I need WooCommerce?

No. Maintenance mode works on any WordPress site. The shop section only does anything when WooCommerce is active, and its settings can be filled in beforehand either way.

I locked myself out. Now what?

Deactivate the plugin from Plugins, which turns both modes off and keeps your settings. If you cannot reach wp-admin at all, rename the limbus-maintenance-page-shop-pause folder over FTP or SFTP. The login page is never blocked, so this should not come up.

What happens if I delete the plugin?

Its single option is deleted and nothing is left behind. Tick Keep my settings if I delete the plugin first if you plan to reinstall.

Reviews

September 16, 2026
Simple and easy to use. No bloat, no ads, no unnecessary notifications. It does exactly what it’s supposed to do and stays out of the way.
Read all 1 review

Contributors & Developers

“Limbus Maintenance Page & Shop Pause” is open source software. The following people have contributed to this plugin.

Contributors

“Limbus Maintenance Page & Shop Pause” has been translated into 1 locale. Thank you to the translators for their contributions.

Translate “Limbus Maintenance Page & Shop Pause” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

1.0.0

  • First release.
  • Maintenance mode with HTTP 503 and Retry-After headers, and no noindex.
  • Self-contained maintenance page: title, message, logo, background and text colours, font stack.
  • Shareable preview link and a path allowlist.
  • Shop pause for WooCommerce: catalogue stays browsable, ordering stops, existing orders remain reachable.
  • Optional start and end times for both modes, evaluated per request rather than by WP-Cron.
  • Settings export and import as JSON.
  • Automatic page-cache purging for WP Rocket, LiteSpeed, W3 Total Cache, WP Super Cache, Cache Enabler, Autoptimize, SiteGround Optimizer, Hummingbird and Breeze.
  • The maintenance page is served as a clean document even with WP_DEBUG on; logging is untouched.
  • Tested with WordPress 7.1 and WooCommerce 11.0.