从自定义管理页面重定向生成“已发送的标题”

时间:2013-02-25 10:17:43

标签: wordpress wordpress-plugin

我已通过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

1 个答案:

答案 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”)