在WordPress的page.php中使用header(location)重定向时出现Header已发送错误
解决WordPress中page.php重定向时Header已发送的问题
嘿,这个问题我太熟悉了!你遇到的「Header已发送」警告,本质原因是HTTP头信息必须在任何页面内容(包括空白字符、HTML标签)输出之前发送,而直接在page.php里写这段代码时,WordPress可能已经提前输出了一些内容(比如主题文件开头的空格、BOM标识,或者某个插件/主题函数提前输出了字符),导致header()函数无法正常工作。
下面给你两种靠谱的解决办法,优先推荐第一种:
方法一:用WordPress官方钩子(最稳妥)
不要在page.php里直接写重定向代码,而是把逻辑放到主题的functions.php文件中,用template_redirect钩子——这个钩子会在WordPress加载模板之前触发,此时还没有任何内容输出,完美适配重定向场景。
代码示例:
add_action('template_redirect', 'custom_page_slug_redirect'); function custom_page_slug_redirect() { global $post; // 先确认当前是页面类型,且post对象存在 if (is_page() && isset($post)) { $post_slug = $post->post_name; if ($post_slug == 'about') { // 用WordPress封装的wp_redirect,比直接header()更规范 wp_redirect(get_site_url() . '/about-us/'); // 必须加上exit,终止后续代码执行,确保重定向生效 exit; } } }
方法二:强制在page.php最顶部执行(不推荐,风险高)
如果你一定要在page.php里写,必须确保这段代码在所有输出之前执行,包括get_header()函数(因为get_header会输出HTML头部内容),同时保证page.php文件开头没有任何空白字符或BOM。
代码示例:
<?php // 这段代码必须放在page.php的最最顶部,不能有任何前置输出 global $post; $post_slug = $post->post_name; if ($post_slug == 'about') { wp_redirect(get_site_url() . '/about-us/'); exit; } // 之后再加载头部模板 get_header(); // 剩下的page.php内容... ?>
关键注意事项
- 一定要加
exit;或die();:如果不加,WordPress会继续执行后续代码,可能导致重定向失效,甚至出现内容混乱。 - 优先用
wp_redirect():这是WordPress官方提供的重定向函数,会自动处理HTTP状态码,比原生的header()更符合WordPress的运行机制。
内容的提问来源于stack exchange,提问作者Anuj Kumar
相关产品推荐
相关产品推荐

