回调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');
每当您尝试查看时,上面的代码都会将您重定向到 Google wp-admin/admin.php?page=myplugin-custom-page-slug
。
就我而言,我已将自定义页面附加add_submenu_page
到管理区域中的默认 (admin.php) 父级,并将自定义页面的 slug 设置为myplugin-custom-page-slug
. switch
如果您有很多自定义管理页面,请随意替换上面代码中的值,甚至添加 PHP 。
这样,每当查看我们的自定义管理页面时,我们已经足够早地进行重定向。
更新:(另一种方法)
多亏了这篇文章,我了解到 WordPress 为每个自定义管理页面创建了一个独特的操作 ( load-{parent_page_slug}_page_{plugin_subpage_slug}
)。例如,如果您添加了一个带有 parentadmin.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”)