
在 WordPress 中使用 PHP 会话进行登录验证时,若在 get_header() 等输出函数之后调用 header() 重定向,将触发“Cannot modify header information”错误;根本原因是 HTTP 头部必须在任何 HTML 输出之前发送。
在 wordpress 中使用 php 会话进行登录验证时,若在 `get_header()` 等输出函数之后调用 `header()` 重定向,将触发“cannot modify header information”错误;根本原因是 http 头部必须在任何 html 输出之前发送。
WordPress 模板的执行顺序决定了头部(HTTP headers)操作的窗口期极短——所有涉及 header()、setcookie() 或 session_start() 的逻辑,必须在任何 HTML、空白字符或 PHP 输出(包括 get_header()、the_content()、echo 等)之前完成。
您当前的 page-solutions.php 将 get_header() 放在了会话校验和重定向之前,导致 结构已开始输出,此时再调用 header("Location: home") 已失效。正确做法是:将权限校验与重定向逻辑置于模板最顶端,在任何 WordPress 模板加载函数之前执行。
✅ 正确写法如下:
<?php /**
* Template Name: Solutions
*/
// 必须在 get_header() 之前检查会话并重定向
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
// 使用 wp_redirect() 更安全(自动处理状态码与缓冲),推荐替代原生 header()
wp_redirect(home_url('/'));
exit; // exit 是必需的,防止后续代码执行
}
// 此时才加载主题头部
get_header();
?><!-- 页面主体内容 --><div id="primary" class="content-area">
<main id="main" class="site-main"><h1>Solutions Page</h1>
<!-- 其他内容 -->
</main>
</div>
<?php get_footer(); ?>
⚠️ 注意事项:
-
不要在 header.php 中调用 session_start():WordPress 主题的 header.php 属于输出阶段,此时启动会话虽可能不报错,但极易因 BOM、空格或提前 echo 导致后续重定向失败。应统一在 functions.php 的 init 钩子中安全启用会话:
// 在主题 functions.php 中添加 add_action('init', function() { if (session_status() === PHP_SESSION_NONE) { session_start(); } }); - 优先使用 wp_redirect() 而非原生 header():它兼容 WordPress 缓冲机制,自动设置 302 状态码,并在必要时调用 exit(但仍建议显式 exit 以确保终止)。
- 避免路径硬编码:home 不是有效 URL;应使用 home_url('/') 获取首页地址,或 wp_login_url() 跳转至登录页。
- 会话安全性补充:生产环境需配置 session_set_cookie_params()(如 httponly, secure, samesite),并在用户登出时调用 $_SESSION = []; session_destroy();。
总结:WordPress 的模板渲染流程不可逆,所有重定向、会话控制、Cookie 设置等头部操作,必须严格前置。把逻辑校验放在 get_header() 之前,配合 wp_redirect() 与合理会话管理,即可彻底规避 headers already sent 错误。











