hooks(); } } /** * Adds the additional hooks, when necessary. * * @since 2.0.0 * @return void */ public function hooks(): void { add_action('wu_ajax_toggle_maintenance_mode', [$this, 'toggle_maintenance_mode']); if ( ! is_main_site()) { add_action('admin_bar_menu', [$this, 'add_notice_to_admin_bar'], 15); } if (self::check_maintenance_mode()) { add_filter('pre_option_blog_public', '__return_true'); if ( ! is_admin()) { add_action('wp', [$this, 'render_page']); if (function_exists('wp_robots_no_robots')) { add_filter('wp_robots', 'wp_robots_no_robots'); // WordPress 5.7+ } else { add_action('wp_head', 'wp_no_robots', 20); } } } } /** * Add maintenance mode Notice to Admin Bar * * @since 2.0.0 * @param WP_Admin_Bar $wp_admin_bar The Admin Bar class. * @return void */ public function add_notice_to_admin_bar($wp_admin_bar): void { if ( ! current_user_can('manage_options')) { return; } if (is_admin() || self::check_maintenance_mode()) { $args = [ 'id' => 'wu-maintenance-mode', 'parent' => 'top-secondary', 'title' => __('Maintenance Mode - Active', 'wp-multisite-waas'), 'href' => '#wp-ultimo-site-maintenance-element', 'meta' => [ 'class' => 'wu-maintenance-mode ' . (self::check_maintenance_mode() ? '' : 'hidden'), 'title' => __('This means that your site is not available for visitors at the moment. Only you and other logged users have access to it. Click here to toggle this option.', 'wp-multisite-waas'), ], ]; $wp_admin_bar->add_node($args); } } /** * Render page - html filtrable * * @since 2.0.0 * @return void */ public function render_page(): void { if (is_main_site() || current_user_can('read')) { return; } $text = apply_filters( 'wu_maintenance_mode_text', __('Website under planned maintenance. Please check back later.', 'wp-multisite-waas') ); $title = apply_filters( 'wu_maintenance_mode_title', __('Under Maintenance', 'wp-multisite-waas') ); wp_die($text, $title, 503); } /** * Check should display maintenance mode * * @since 2.0.0 * @return boolean */ public static function check_maintenance_mode() { return get_site_meta(get_current_blog_id(), 'wu_maintenance_mode', true); } /** * Callback button admin toggle maintenance mode. * * @since 2.0.0 * @return mixed */ public function toggle_maintenance_mode() { check_ajax_referer('wu_toggle_maintenance_mode', $_POST['_wpnonce']); $site_id = \WP_Ultimo\Helpers\Hash::decode(wu_request('site_hash'), 'site'); if ( ! current_user_can_for_blog($site_id, 'manage_options')) { wp_send_json_error( [ 'message' => __('You do not have the necessary permissions to perform this option.', 'wp-multisite-waas'), 'value' => false, ] ); } $value = wu_request('maintenance_status', false); $value = wu_string_to_bool($value); update_site_meta($site_id, 'wu_maintenance_mode', $value); $return = [ 'message' => __('New maintenance settings saved.', 'wp-multisite-waas'), 'value' => $value, ]; // Flush the cache so the maintenance mode new status is applied immediately. Cache_Manager::get_instance()->flush_known_caches(); wp_send_json_success($return); } /** * Filter the WP Multisite WaaS settings to add Jumper options * * @since 2.0.0 * @return void */ public function add_settings(): void { wu_register_settings_field( 'sites', 'maintenance_mode', [ 'title' => __('Site Maintenance Mode', 'wp-multisite-waas'), 'desc' => __('Allow your customers and super admins to quickly take sites offline via a toggle on the site dashboard.', 'wp-multisite-waas'), 'type' => 'toggle', 'default' => 0, 'order' => 23, ] ); } }