WordPress维护模式管理员登录权限问题及代码修复求助
WordPress维护模式管理员登录修复方案
问题根源
现有代码存在几个关键问题导致功能失效:
- 表单
action中的PHP代码被当作字符串输出,未被解析执行 - 用户密码验证逻辑错误(直接对比哈希密码与明文)
- 维护模式判断逻辑有误,导致维护页失效
- 错误使用
get_option('admin_email')获取用户ID(该选项返回邮箱而非ID) - 误用不存在的核心函数
wp_maintenance_mode(),需替换为自定义维护模式开关逻辑
修正后的完整代码
// 维护模式页面钩子,优先执行 add_action('template_redirect', 'custom_maintenance_mode_page'); function custom_maintenance_mode_page() { // 已登录且有权限的管理员跳过维护页 if (is_user_logged_in() && current_user_can('edit_themes')) { return; } // 维护页内容 $text = '站点正在更新,请稍候。'; $text2 = '如需关闭维护模式,请输入站点管理员的邮箱或用户名及密码'; ?> <html> <body> <div style="text-align:center;margin-top:100px;"> <p class="txt-edit_themes"><?php echo esc_html($text); ?></p> <p class="txt-edit_themes"><?php echo esc_html($text2); ?></p> <!-- 使用正确的登录URL,直接调用函数而非嵌套PHP --> <form method="post" action="<?php echo esc_url(wp_login_url(get_permalink())); ?>" class="input-group"> <p><input type="text" name="log" id="user_Login" placeholder="邮箱或用户名"></p> <p><input type="password" name="pwd" id="user_Pass" placeholder="密码"></p> <p><input type="submit" name="wp-submit" value="登录" class="button-primary"></p> <!-- 登录成功后跳转至维护模式设置页 --> <input type="hidden" name="redirect_to" value="<?php echo esc_url(admin_url('admin.php?page=site-maintenance')); ?>"> <?php wp_nonce_field('login_form'); ?> </form> </div> </body> </html> <?php die(); // 终止页面继续加载,确保维护页独占显示 } // 可选:管理员登录后自动关闭维护模式(适配自定义开关逻辑) add_action('wp_login', 'auto_disable_maintenance_on_admin_login', 10, 2); function auto_disable_maintenance_on_admin_login($user_login, $user) { if (current_user_can('edit_themes')) { // 替换为你实际的维护模式开关逻辑,比如更新选项 update_option('site_maintenance_mode', 'off'); } }
关键修改说明
- 表单Action修复:直接在HTML中调用
wp_login_url()并传入当前页面作为回调,确保PHP代码被正确解析,同时用esc_url()保证URL安全。 - 维护模式判断逻辑:先判断已登录且有权限的用户,直接返回跳过维护页;其他用户显示维护页并
die()终止加载,避免维护模式失效。 - 登录表单标准化:使用WordPress标准登录字段名(
log、pwd、wp-submit),添加redirect_to隐藏字段,登录成功后直接跳转到维护模式设置页面。 - 密码验证安全化:依赖WordPress原生登录机制验证密码,避免手动对比哈希值的错误。
- 自动关闭维护模式:通过
wp_login钩子,管理员登录后自动关闭维护模式(需替换为你实际的开关逻辑,比如自定义选项控制)。
额外注意事项
- 确保
update_option('site_maintenance_mode', 'off')与你的维护模式开关逻辑一致。 - 测试前确认管理员账号正常,避免锁死自身访问。
- 保留
wp_nonce_field()防止CSRF攻击,提升安全性。
内容的提问来源于stack exchange,提问作者php
相关产品推荐
相关产品推荐

