从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”)