To prevent my visitors from seeing a broken version of my site during maintenance, and to give them a heads up on the updates, I would like to redirect them automatically to a temporary maintenance page. I am looking for a portable solution which can be used on any site, without hardcoding URLs.
Logged in administrators (or other user level of choice) should get full access to the back-end and the front-end. There are a lot of plugins out there that offer this functionality, but I’m looking for a code-only solution.
WordPress has an embedded feature for handling maintenance mode.
When you upgrade a plugin, or WordPress core from WP dashboard, WordPress enters maintenance mode: it tries to load a file named maintenance.php
located in the content folder (usually /wp-content
), and if that file is not there, WP shows a default message.
I suggest you use that file, in this way you’ll be consistent for your manually-triggered maintenance and for WordPress-handled maintenance.
How To
-
First of all create the
maintenance.php
file and put there the content you want. For styling I suggest you put CSS in the file itself, using<style>
tag; generally this is not good advice, but in this case it gives you the ability of using the file for WordPress-handled maintenance mode, when no theme is loaded (and the theme may be upgrading, so not reliable). -
Save the file just created in content folder (usually
/wp-content
). -
In your
functions.php
put:add_action( 'wp_loaded', function() { global $pagenow; if( defined( 'IN_MAINTENANCE' ) && IN_MAINTENANCE && $pagenow !== 'wp-login.php' && ! is_user_logged_in() ) { header( 'HTTP/1.1 Service Unavailable', true, 503 ); header( 'Content-Type: text/html; charset=utf-8' ); header( 'Retry-After: 3600' ); if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) { require_once( WP_CONTENT_DIR . '/maintenance.php' ); } die(); } });
This code will check a constant (see next point) and if user is not logged in, load the file created at point #1 and exit.
If you want to allow only users with specific capabilities, use
current_user_can('capability_to_allow')
instead ofis_user_logged_in()
. See Codex for more info.Maybe you can add to
maintenance.php
a link to login page; in this way a non-logged user can click it without having to manually enter the login URL in the address bar.If you are using a theme developed by a 3rd party, use a child theme; in this way you will be able to safely update the theme without losing your changes.
-
When you want to enable maintenance mode, open your
wp_config.php
and put there:define('IN_MAINTENANCE', true);
After that, when you are ready to make your site public again, just remove that line or change
true
tofalse
for easier re-enabling.