settings = mmbd_get_settings(); add_action( 'admin_menu', array( $this, 'add_settings_page' ) ); add_action( 'admin_init', array( $this, 'register_settings' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) ); add_action( 'admin_notices', array( $this, 'admin_notice' ) ); add_filter( 'plugin_action_links_' . MMBD_PLUGIN_BASENAME, array( $this, 'add_settings_link' ) ); } public function add_settings_page() { add_options_page( __( 'DevLab Maintenance Mode', 'devlab-maintenance-mode' ), __( 'Maintenance Mode', 'devlab-maintenance-mode' ), 'manage_options', 'devlab-maintenance-mode', array( $this, 'render_settings_page' ) ); } public function register_settings() { register_setting( 'mmbd_settings_group', 'mmbd_settings', array( 'type' => 'array', 'sanitize_callback' => array( $this, 'sanitize_settings' ), 'default' => mmbd_get_default_settings(), ) ); add_settings_section( 'mmbd_main_section', __( 'Maintenance Mode Settings', 'devlab-maintenance-mode' ), array( $this, 'render_main_section' ), 'devlab-maintenance-mode' ); add_settings_field( 'mmbd_enabled', __( 'Enable Maintenance Mode', 'devlab-maintenance-mode' ), array( $this, 'render_enabled_field' ), 'devlab-maintenance-mode', 'mmbd_main_section' ); add_settings_field( 'mmbd_message', __( 'Maintenance Message', 'devlab-maintenance-mode' ), array( $this, 'render_message_field' ), 'devlab-maintenance-mode', 'mmbd_main_section' ); add_settings_section( 'mmbd_template_section', __( 'Template Selection', 'devlab-maintenance-mode' ), array( $this, 'render_template_section' ), 'devlab-maintenance-mode' ); add_settings_field( 'mmbd_template', __( 'Choose Template', 'devlab-maintenance-mode' ), array( $this, 'render_template_selection_field' ), 'devlab-maintenance-mode', 'mmbd_template_section' ); add_settings_field( 'mmbd_countdown_date', __( 'Countdown Date', 'devlab-maintenance-mode' ), array( $this, 'render_countdown_date_field' ), 'devlab-maintenance-mode', 'mmbd_template_section' ); add_settings_section( 'mmbd_bypass_section', __( 'Bypass Options', 'devlab-maintenance-mode' ), array( $this, 'render_bypass_section' ), 'devlab-maintenance-mode' ); add_settings_field( 'mmbd_bypass_roles', __( 'Bypass Roles', 'devlab-maintenance-mode' ), array( $this, 'render_bypass_roles_field' ), 'devlab-maintenance-mode', 'mmbd_bypass_section' ); add_settings_field( 'mmbd_ip_whitelist', __( 'IP Whitelist', 'devlab-maintenance-mode' ), array( $this, 'render_ip_whitelist_field' ), 'devlab-maintenance-mode', 'mmbd_bypass_section' ); add_settings_field( 'mmbd_secret_phrase', __( 'Secret Phrase', 'devlab-maintenance-mode' ), array( $this, 'render_secret_phrase_field' ), 'devlab-maintenance-mode', 'mmbd_bypass_section' ); add_settings_field( 'mmbd_cookie_duration', __( 'Cookie Duration', 'devlab-maintenance-mode' ), array( $this, 'render_cookie_duration_field' ), 'devlab-maintenance-mode', 'mmbd_bypass_section' ); add_settings_section( 'mmbd_modules_section', __( 'Modules', 'devlab-maintenance-mode' ), array( $this, 'render_modules_section' ), 'devlab-maintenance-mode' ); add_settings_field( 'mmbd_analytics_id', __( 'Google Analytics ID', 'devlab-maintenance-mode' ), array( $this, 'render_analytics_id_field' ), 'devlab-maintenance-mode', 'mmbd_modules_section' ); add_settings_field( 'mmbd_social_facebook', __( 'Facebook URL', 'devlab-maintenance-mode' ), array( $this, 'render_social_facebook_field' ), 'devlab-maintenance-mode', 'mmbd_modules_section' ); add_settings_field( 'mmbd_social_twitter', __( 'Twitter / X URL', 'devlab-maintenance-mode' ), array( $this, 'render_social_twitter_field' ), 'devlab-maintenance-mode', 'mmbd_modules_section' ); add_settings_field( 'mmbd_social_instagram', __( 'Instagram URL', 'devlab-maintenance-mode' ), array( $this, 'render_social_instagram_field' ), 'devlab-maintenance-mode', 'mmbd_modules_section' ); add_settings_field( 'mmbd_social_linkedin', __( 'LinkedIn URL', 'devlab-maintenance-mode' ), array( $this, 'render_social_linkedin_field' ), 'devlab-maintenance-mode', 'mmbd_modules_section' ); } public function sanitize_settings( $input ) { $sanitized = array(); $sanitized['enabled'] = ! empty( $input['enabled'] ); $sanitized['message'] = isset( $input['message'] ) ? wp_kses_post( $input['message'] ) : mmbd_get_default_settings()['message']; $sanitized['bypass_roles'] = array(); if ( isset( $input['bypass_roles'] ) && is_array( $input['bypass_roles'] ) ) { $wp_roles = wp_roles()->get_names(); foreach ( $input['bypass_roles'] as $role ) { $role = sanitize_key( $role ); if ( array_key_exists( $role, $wp_roles ) ) { $sanitized['bypass_roles'][] = $role; } } } $sanitized['ip_whitelist'] = ''; if ( isset( $input['ip_whitelist'] ) ) { $ips = array_filter( array_map( 'trim', explode( "\n", $input['ip_whitelist'] ) ) ); $valid_ips = array(); foreach ( $ips as $ip ) { $ip = sanitize_text_field( $ip ); if ( filter_var( $ip, FILTER_VALIDATE_IP ) ) { $valid_ips[] = $ip; } } $sanitized['ip_whitelist'] = implode( "\n", $valid_ips ); } $sanitized['secret_phrase'] = isset( $input['secret_phrase'] ) ? sanitize_text_field( $input['secret_phrase'] ) : ''; $sanitized['cookie_duration'] = isset( $input['cookie_duration'] ) ? absint( $input['cookie_duration'] ) : 1; $sanitized['cookie_duration'] = max( 1, min( 30, $sanitized['cookie_duration'] ) ); $sanitized['template'] = isset( $input['template'] ) ? sanitize_key( $input['template'] ) : 'classic'; $sanitized['template'] = MMBD_Templates::validate_template_id( $sanitized['template'] ); $sanitized['countdown_date'] = ''; if ( ! empty( $input['countdown_date'] ) ) { $sanitized['countdown_date'] = sanitize_text_field( $input['countdown_date'] ); } $sanitized['analytics_id'] = ''; if ( ! empty( $input['analytics_id'] ) ) { $sanitized['analytics_id'] = sanitize_text_field( $input['analytics_id'] ); } $sanitized['social_facebook'] = ! empty( $input['social_facebook'] ) ? esc_url_raw( $input['social_facebook'] ) : ''; $sanitized['social_twitter'] = ! empty( $input['social_twitter'] ) ? esc_url_raw( $input['social_twitter'] ) : ''; $sanitized['social_instagram'] = ! empty( $input['social_instagram'] ) ? esc_url_raw( $input['social_instagram'] ) : ''; $sanitized['social_linkedin'] = ! empty( $input['social_linkedin'] ) ? esc_url_raw( $input['social_linkedin'] ) : ''; $sanitized['version'] = MMBD_VERSION; return $sanitized; } public function enqueue_admin_assets( $hook ) { if ( 'settings_page_devlab-maintenance-mode' !== $hook ) { return; } wp_enqueue_style( 'mmbd-admin', MMBD_PLUGIN_URL . 'assets/css/admin.css', array(), MMBD_VERSION ); wp_enqueue_script( 'mmbd-admin', MMBD_PLUGIN_URL . 'assets/js/admin.js', array(), MMBD_VERSION, true ); } public function admin_notice() { if ( empty( $this->settings['enabled'] ) ) { return; } $settings_url = admin_url( 'options-general.php?page=devlab-maintenance-mode' ); ?>

—

%s', admin_url( 'options-general.php?page=devlab-maintenance-mode' ), __( 'Settings', 'devlab-maintenance-mode' ) ); array_unshift( $links, $settings_link ); return $links; } public function render_settings_page() { if ( ! current_user_can( 'manage_options' ) ) { return; } $this->settings = mmbd_get_settings(); ?>

render_status_indicator(); ?>
render_preview_section(); ?>
settings['enabled'] ); $class = $enabled ? 'mmbd-status-on' : 'mmbd-status-off'; $text = $enabled ? __( 'Maintenance Mode is ON - Site is not accessible to visitors', 'devlab-maintenance-mode' ) : __( 'Maintenance Mode is OFF - Site is accessible to everyone', 'devlab-maintenance-mode' ); ?>

' . esc_html__( 'Configure your maintenance mode settings below.', 'devlab-maintenance-mode' ) . '

'; } public function render_modules_section() { echo '

' . esc_html__( 'Add extra functionality to your maintenance page.', 'devlab-maintenance-mode' ) . '

'; } public function render_analytics_id_field() { $id = isset( $this->settings['analytics_id'] ) ? $this->settings['analytics_id'] : ''; ?>

settings['social_facebook'] ) ? $this->settings['social_facebook'] : ''; ?> settings['social_twitter'] ) ? $this->settings['social_twitter'] : ''; ?> settings['social_instagram'] ) ? $this->settings['social_instagram'] : ''; ?> settings['social_linkedin'] ) ? $this->settings['social_linkedin'] : ''; ?> ' . esc_html__( 'Configure who can bypass maintenance mode and access the site normally.', 'devlab-maintenance-mode' ) . '

'; } public function render_template_section() { echo '

' . esc_html__( 'Choose a template design for your maintenance page.', 'devlab-maintenance-mode' ) . '

'; } public function render_template_selection_field() { $templates = MMBD_Templates::get_templates(); $selected = isset( $this->settings['template'] ) ? $this->settings['template'] : 'classic'; $selected = MMBD_Templates::validate_template_id( $selected ); ?>
$template ) : ?>
settings['countdown_date'] ) ? $this->settings['countdown_date'] : ''; ?>

settings['enabled'] ); ?>

settings['message'] ) ? $this->settings['message'] : ''; ?>

settings['bypass_roles'] ) ? $this->settings['bypass_roles'] : array(); $wp_roles = wp_roles()->get_names(); ?>
$role_name ) : ?>

settings['ip_whitelist'] ) ? $this->settings['ip_whitelist'] : ''; $current_ip = $this->get_current_ip(); ?>


' . esc_html( $current_ip ) . '' ); ?>

settings['secret_phrase'] ) ? $this->settings['secret_phrase'] : ''; ?>


' . esc_url( home_url( '?mmbd_bypass=' . rawurlencode( $phrase ) ) ) . '' ); ?>

settings['cookie_duration'] ) ? $this->settings['cookie_duration'] : 1; ?>