2013-02-25 52 views
2

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

回答

7

add_submenu_page回调发生得太晚(在管理员侧栏和标题呈现之后),这就是为什么location标题无法再发送。

为了实现这一点,我们需要在发送标题之前(例如admin_init)在WordPress管理区域稍早挂钩一个函数。

一个好办法:

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上面的代码将您重定向到谷歌。

在我的情况下,我通过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和蛞蝓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”)

相关问题