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)の親にカスタムページを添付し、カスタムページのスラッグをに設定しました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」)。

于 2013-02-25T12:11:49.540 に答える