からのコールバックは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)の親にカスタムページを添付し、カスタムページのスラッグをに設定しましたmyplugin-custom-page-slug
。上記のコードの値を自由に置き換えたりswitch
、カスタム管理ページがたくさんある場合はPHPを追加したりしてください。
このようにして、カスタム管理ページが表示されるたびにリダイレクトを実行するのに十分な早さでフックしました。
更新:(別のアプローチ)
この投稿のおかげで、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.php」ではなく「admin」)。