在WordPress中输出<style>为何触发‘Cannot modify header information’错误?
解决WordPress后台「Cannot modify header information」错误
嘿,这个错误我太熟了!问题出在你选的钩子和输出方式上——你在admin_init里直接echo样式代码,可这个钩子是在WordPress发送HTTP响应头的阶段触发的,这时候直接输出内容会打乱头信息的发送顺序,自然就报错了。
给你两个靠谱的修正方案:
方案一:用正确的钩子输出CSS样式
把输出逻辑移到admin_head钩子(这是WordPress专门给后台头部内容预留的钩子,完全不会触发头信息冲突),同时修正权限判断的小问题(current_user_can('admin')不是WordPress的标准写法哦):
add_action('admin_head', 'wpse74389_hide_admin_menu_items'); function wpse74389_hide_admin_menu_items(){ $user = wp_get_current_user(); // 检查当前用户是否是管理员角色 if (in_array('administrator', $user->roles)) { ?> <style> li#menu-settings .wp-submenu.wp-submenu-wrap li:last-child, li#menu-settings .wp-submenu.wp-submenu-wrap li:nth-child(2) { display: none !important; } </style> <?php } }
方案二:直接移除子菜单(更优雅彻底)
如果不想用CSS隐藏,还可以直接从后台菜单结构里删掉这些子项,这样用户连URL访问的机会都没有,比CSS更靠谱:
add_action('admin_menu', 'wpse74389_remove_submenu_items'); function wpse74389_remove_submenu_items(){ // 用manage_options权限判断,管理员默认拥有这个权限 if (current_user_can('manage_options')) { // 第一个参数是父菜单的slug,第二个是子菜单的slug // 替换成你要隐藏的子项对应的slug就行 remove_submenu_page('options-general.php', 'options-writing.php'); remove_submenu_page('options-general.php', 'options-discussion.php'); } }
补充说明
- 权限判断那块,你之前写的
current_user_can('admin')不对,WordPress里没有这个权限标识,要么检查角色administrator,要么用管理员专属权限manage_options。 - 方案一的CSS写法我也调整了,用PHP闭合标签直接输出HTML,比转义后的echo更易读,也不容易出错。
内容的提问来源于stack exchange,提问作者emiliano
相关产品推荐
相关产品推荐

