File: //wordpress/mu-plugins/atomic-cli-maintenance-mode.php
<?php
/**
* Override native WP CLI maintenance mode command with one that is compatible with WP Cloud infrastructure.
*/
if ( class_exists( 'WP_CLI' ) && ! class_exists( 'WPCloud_MaintenanceModeCommand' ) && class_exists( 'WP_CLI\MaintenanceMode\MaintenanceModeCommand' ) ) {
class WPCloud_MaintenanceModeCommand extends WP_CLI\MaintenanceMode\MaintenanceModeCommand {
public function activate( $_, $assoc_args ) {
if ( $this->_get_maintenance_mode_status() && ! WP_CLI\Utils\get_flag_value( $assoc_args, 'force' ) ) {
WP_CLI::error( 'Maintenance mode already activated.' );
}
global $wp_filesystem;
if ( ! $wp_filesystem ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
WP_Filesystem();
}
// Is our plugin available?
$target = '../../../../../scripts/wpcloud-maintenance-mode.php';
if ( ! file_exists( $target ) ) {
WP_CLI::error( 'Maintenance mode plugin unavailable for symlinking.' );
}
// Symlink WP Cloud maintenance mode mu-plugin
$link = trailingslashit( $wp_filesystem->wp_content_dir() ) . '/mu-plugins/wpcloud-maintenance-mode.php';
if ( file_exists( $link ) ) {
if ( ! is_link( $link ) ) {
WP_CLI::error( 'Unmanaged maintenance mode plugin detected.' );
}
if ( $target !== readlink( $link ) ) {
WP_CLI::error( 'Target of maintenance mode plugin unknown.' );
}
} else {
symlink( $target, $link );
}
if ( ! file_exists( $link ) || ! is_link( $link ) || ( $target !== readlink( $link ) ) ) {
WP_CLI::error( 'Unable to install maintenance mode plugin.' );
}
// Add WP Cloud custom maintenance file
$file = trailingslashit( $wp_filesystem->wp_content_dir() ) . '.wpcloud-maintenance';
$maintenance_string = '<?php $upgrading = ' . time() . '; ?>';
$wp_filesystem->delete( $file );
$wp_filesystem->put_contents( $file, $maintenance_string, FS_CHMOD_FILE );
WP_CLI::success( 'Activated Maintenance mode.' );
}
public function deactivate() {
if ( ! $this->_get_maintenance_mode_status() ) {
WP_CLI::error( 'Maintenance mode already deactivated.' );
}
global $wp_filesystem;
if ( ! $wp_filesystem ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
WP_Filesystem();
}
// Remove WP Cloud maintenance mode plugin
$link = trailingslashit( $wp_filesystem->wp_content_dir() ) . '/mu-plugins/wpcloud-maintenance-mode.php';
$target = '../../../../../scripts/wpcloud-maintenance-mode.php';
if ( file_exists( $link ) && is_link( $link ) && $target === readlink( $link ) ) {
$wp_filesystem->delete( $link );
}
// Handle WP Cloud custom maintenance file
$file = trailingslashit( $wp_filesystem->wp_content_dir() ) . '.wpcloud-maintenance';
if ( file_exists( $file ) ) {
$wp_filesystem->delete( $file );
}
WP_CLI::success( 'Deactivated Maintenance mode.' );
}
public function status() {
$status = $this->_get_maintenance_mode_status() ? 'active' : 'not active';
WP_CLI::line( "Maintenance mode is {$status}." );
}
public function is_active() {
WP_CLI::halt( $this->_get_maintenance_mode_status() ? 0 : 1 );
}
private function _get_maintenance_mode_status() {
$wp_filesystem = $this->_init_wp_filesystem();
$file = trailingslashit( $wp_filesystem->wp_content_dir() ) . '.wpcloud-maintenance';
if ( ! $wp_filesystem->exists( $file ) ) {
return false;
}
$upgrading = 0;
$contents = $wp_filesystem->get_contents( $file );
$matches = [];
if ( preg_match( '/upgrading\s*=\s*(\d+)\s*;/i', $contents, $matches ) ) {
$upgrading = (int) $matches[1];
} else {
WP_CLI::warning( 'Unable to read the maintenance file timestamp, non-numeric value detected.' );
}
// The logic here is based on the core WordPress `wp_is_maintenance_mode()` function.
if ( ( time() - $upgrading ) >= 10 * MINUTE_IN_SECONDS ) {
return false;
}
$link = trailingslashit( $wp_filesystem->wp_content_dir() ) . '/mu-plugins/wpcloud-maintenance-mode.php';
$target = '../../../../../scripts/wpcloud-maintenance-mode.php';
if ( ! file_exists( $link ) ) {
return false;
}
if ( ! is_link( $link ) ) {
return false;
}
if ( $target !== readlink( $link ) ) {
return false;
}
return true;
}
protected function _init_wp_filesystem() {
global $wp_filesystem;
WP_Filesystem();
return $wp_filesystem;
}
}
WP_CLI::add_command( 'maintenance-mode', 'WPCloud_MaintenanceModeCommand' );
}