我已通过add_submenu_page
在我的插件中注册了自定义管理页面。在回调函数(生成管理页面内容的函数)中,我有以下代码:
wp_redirect('http://google.com');
exit;
然而,当我访问管理页面时,我收到一个错误:
Warning: Cannot modify header information - headers already sent by (output started at ..\wp-admin\includes\template.php:1637) in ..\wp-includes\pluggable.php on line 878
答案 0 :(得分:7)
来自add_submenu_page
的回调发生得太晚(在管理侧栏和标题呈现后),这就是为什么location
标题无法再发送的原因。
为了实现这一点,我们需要在发送标题之前在WordPress管理区域中稍早挂钩一个函数(例如admin_init
)。
一个好方法:
function myplugin_preprocess_pages($value){
global $pagenow;
$page = (isset($_REQUEST['page']) ? $_REQUEST['page'] : false);
if($pagenow=='admin.php' && $page=='myplugin-custom-page-slug'){
wp_redirect('http://google.com');
exit;
}
}
add_action('admin_init', 'myplugin_preprocess_pages');
只要您尝试查看wp-admin/admin.php?page=myplugin-custom-page-slug
,上述代码就会将您重定向到Google。
就我而言,我已经通过add_submenu_page
将自定义页面附加到管理区域中的默认(admin.php)父级,并且我已将自定义页面的slug设置为myplugin-custom-page-slug
。如果你有很多自定义管理页面,可以随意替换上面代码中的值,甚至可以添加PHP switch
。
通过这种方式,只要我们查看自定义管理页面,我们就足够早地进行重定向。
更新: (另一种方法)
感谢this post,我了解到WordPress创建了一个可以为每个自定义管理页面(load-{parent_page_slug}_page_{plugin_subpage_slug}
)挂钩的唯一操作。例如,如果您添加了包含父admin.php
和slug myplugin-custom-page
的自定义管理页面,则可以通过以下方式挂钩其“加载”操作:
add_action( 'load-admin_page_myplugin-custom-page', 'myplugin_custom_page_redirect' );
function myplugin_custom_page_redirect() {
if ( 'myplugin-custom-page' == filter_input( INPUT_GET, 'page' ) ) {
wp_redirect( 'http://google.com' );
exit;
}
}
请注意,操作名称有一些需要考虑的事项。它是下划线和短划线的混合,并确保您只包含没有扩展名的父页面名称(所以“admin”而不是“admin.php”)