You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

238 lines
7.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* 维护模式功能
*
* 提供网站维护模式的开启/关闭及自定义设置
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
/**
* 注册维护模式设置菜单
*/
function nenghui_maintenance_menu() {
add_options_page(
'维护模式设置', // 页面标题
'维护模式', // 菜单标题
'manage_options', // 权限要求
'nenghui-maintenance', // 菜单slug
'nenghui_maintenance_page_html' // 回调函数
);
}
add_action('admin_menu', 'nenghui_maintenance_menu');
/**
* 注册设置项
*/
function nenghui_register_maintenance_settings() {
register_setting('nenghui_maintenance_options', 'nenghui_maintenance_mode_enabled');
register_setting('nenghui_maintenance_options', 'nenghui_maintenance_mode_title');
register_setting('nenghui_maintenance_options', 'nenghui_maintenance_mode_content');
}
add_action('admin_init', 'nenghui_register_maintenance_settings');
/**
* 设置页面 HTML
*/
function nenghui_maintenance_page_html() {
if (!current_user_can('manage_options')) {
return;
}
?>
<div class="wrap">
<h1><?php echo esc_html(get_admin_page_title()); ?></h1>
<form action="options.php" method="post">
<?php
settings_fields('nenghui_maintenance_options');
do_settings_sections('nenghui_maintenance_options');
$enabled = get_option('nenghui_maintenance_mode_enabled');
$title = get_option('nenghui_maintenance_mode_title', '网站维护中');
$content = get_option('nenghui_maintenance_mode_content', '我们正在对网站进行升级维护,请稍后再访问。');
?>
<table class="form-table">
<tr valign="top">
<th scope="row">启用维护模式</th>
<td>
<label>
<input type="checkbox" name="nenghui_maintenance_mode_enabled" value="1" <?php checked(1, $enabled, true); ?> />
开启维护模式
</label>
<p class="description">开启后,只有管理员可以访问前台,普通访客将看到维护页面。</p>
</td>
</tr>
<tr valign="top">
<th scope="row">维护标题</th>
<td>
<input type="text" name="nenghui_maintenance_mode_title" value="<?php echo esc_attr($title); ?>" class="regular-text" />
</td>
</tr>
<tr valign="top">
<th scope="row">维护内容</th>
<td>
<?php
wp_editor($content, 'nenghui_maintenance_mode_content', array(
'textarea_name' => 'nenghui_maintenance_mode_content',
'media_buttons' => false,
'textarea_rows' => 10,
'teeny' => true
));
?>
</td>
</tr>
</table>
<?php submit_button(); ?>
</form>
</div>
<?php
}
/**
* 执行维护模式拦截
*/
function nenghui_maintenance_mode_handler() {
// 如果维护模式未开启,直接返回
if (!get_option('nenghui_maintenance_mode_enabled')) {
return;
}
// 如果是管理员或已登录用户,允许访问
// 这里使用 edit_themes 权限作为判断标准,通常管理员和编辑都有此权限
// 或者简单地使用 is_user_logged_in() 允许所有登录用户
if (current_user_can('edit_themes') || is_user_logged_in()) {
return;
}
// 排除登录页面和后台
if (in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php'))) {
return;
}
if (is_admin()) {
return;
}
// 获取设置的标题和内容
$title = get_option('nenghui_maintenance_mode_title', '网站维护中');
$content = get_option('nenghui_maintenance_mode_content', '我们正在对网站进行升级维护,请稍后再访问。');
// 处理内容中的换行如果是纯文本框输入的话但这里用了wp_editor通常不需要nl2br不过为了保险可以加上wpautop
$content_html = wpautop($content);
// 获取站点 Logo
$logo_url = get_theme_mod('site_logo');
if (!$logo_url) {
$logo_url = 'https://nenghui.com/wp-content/uploads/2025/11/logo-2.png';
}
// 发送 503 状态码
header('HTTP/1.1 503 Service Unavailable');
header('Retry-After: 3600');
// 输出维护页面
?>
<!DOCTYPE html>
<html lang="<?php echo get_bloginfo('language'); ?>">
<head>
<meta charset="<?php echo get_bloginfo('charset'); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo esc_html($title); ?> - <?php echo get_bloginfo('name'); ?></title>
<style>
:root {
--primary-color: #007cba;
--text-color: #333;
--bg-color: #f7f9fc;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
background: var(--bg-color);
color: var(--text-color);
height: 100vh;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
.maintenance-container {
background: #fff;
padding: 60px 40px;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0,0,0,0.08);
max-width: 500px;
width: 90%;
margin: 20px;
position: relative;
overflow: hidden;
}
.maintenance-container::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 6px;
background: linear-gradient(90deg, #007cba, #00a0d2);
}
.logo {
margin-bottom: 30px;
}
.logo img {
max-height: 60px;
width: auto;
}
h1 {
color: #222;
margin: 0 0 20px;
font-size: 24px;
font-weight: 600;
}
.content {
font-size: 16px;
line-height: 1.6;
color: #666;
margin-bottom: 30px;
}
.footer {
margin-top: 30px;
font-size: 13px;
color: #999;
border-top: 1px solid #f0f0f0;
padding-top: 20px;
}
.maintenance-icon {
font-size: 48px;
margin-bottom: 20px;
color: var(--primary-color);
}
</style>
</head>
<body>
<div class="maintenance-container">
<?php if ($logo_url): ?>
<div class="logo">
<img src="<?php echo esc_url($logo_url); ?>" alt="<?php echo esc_attr(get_bloginfo('name')); ?>">
</div>
<?php else: ?>
<div class="maintenance-icon">⚙️</div>
<?php endif; ?>
<h1><?php echo esc_html($title); ?></h1>
<div class="content">
<?php echo $content_html; // 允许HTML内容 ?>
</div>
<div class="footer">
&copy; <?php echo date('Y'); ?> Nenghui Energy Technology Co.,Ltd. All rights reserved.
</div>
</div>
</body>
</html>
<?php
exit();
}
// 挂载到 template_redirect 或 get_header
add_action('template_redirect', 'nenghui_maintenance_mode_handler');