3

我已经在我的插件中注册了一个自定义管理页面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
4

1 回答 1

8

回调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”)

于 2013-02-25T12:11:49.540 回答