
在 WordPress 主题中使用 PHP 原生会话(session_start())进行登录状态校验时,若在 get_header() 等输出函数之后调用 header("Location: ..."),将触发“Cannot modify header information”错误——因其违反了 HTTP 头必须在任何内容输出前发送的底层规则。
在 wordpress 主题中使用 php 原生会话(`session_start()`)进行登录状态校验时,若在 `get_header()` 等输出函数之后调用 `header("location: ...")`,将触发“cannot modify header information”错误——因其违反了 http 头必须在任何内容输出前发送的底层规则。
WordPress 模板文件(如 page-solutions.php)本质上是 PHP 脚本,其执行顺序直接影响 HTTP 响应流程。当你先调用 get_header(),WordPress 会立即加载并输出 header.php 中的 HTML 内容(包括 DOCTYPE、 标签等),此时响应头已隐式发送,后续再调用 header() 函数就会失败。
根本原因在于:
- session_start() 在 header.php 中调用虽无错,但仅启动会话;
- 真正导致问题的是 重定向逻辑的位置不当 —— 它必须位于任何模板输出(如 get_header()、the_content()、甚至空白字符或换行)之前。
✅ 正确做法:将权限校验与重定向逻辑置于 get_header() 之前,确保零输出:
将 LaTeX(.tex)学术论文转换为 Word(.docx),支持可编辑的 OMML 公式、原生 Word 表格、嵌入图形、IEEE 双栏排版及参考文献
<?php /**
* Template Name: Solutions
*/
// 必须在任何输出前检查登录状态并重定向
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
wp_redirect(home_url('/')); // 推荐:使用 WordPress 原生函数,自动处理 URL 和 exit
exit;
}
get_header(); // 此时才安全输出页面头部
?><div id="primary" class="content-area">
<main id="main" class="site-main"><!-- 页面主体内容 --><h1>Solutions Page</h1>
<?php the_content(); ?></main>
</div>
<?php get_footer(); ?>
? 关键注意事项:
- 永远优先使用 wp_redirect() 而非原生 header():它兼容 WordPress 的重定向机制(如自动添加 exit、支持相对/绝对 URL、适配多站点环境),且更安全可靠;
- 避免在 header.php 中调用 session_start():WordPress 已有完善的用户认证系统(wp_signon()、is_user_logged_in()),建议优先使用 wp_login_form() + wp_redirect() 实现标准登录流程;
- 若必须使用自定义会话,请确保 session_start() 在 wp_head() 或任何模板输出前执行(例如在 functions.php 的 after_setup_theme 钩子中启动);
- 检查 header.php 文件开头是否有 UTF-8 BOM 或多余空格——它们也会导致“headers already sent”错误。
? 总结:HTTP 重定向是服务器端行为,必须发生在响应体发送之前。在 WordPress 模板中,一切逻辑判断与跳转都应放在 get_header()、the_post() 等输出函数之前。遵循这一原则,即可彻底规避此类报错,并构建健壮的访问控制逻辑。










