WordPressでリダイレクト処理を行いたい場合(あんまりない・・・)に、用意されている関数である「wp_redirect()」を使っても「Warning: Cannot modify header information – headers already sent by ・・・」とエラーが出てダメだったので、備忘録を残そうと思います。

実は会員サイトを作るという案件を対応しておりまして、ユーザーの権限レベルなどでスマートにリダイレクトしたい、という箇所がいくつかありました。

検索した割にしっくり来る情報がありませんでしたので書き残して置きたいとおもいます。

フック使って最速で実行しないとダメ

そもそもPHPのリダイレクト処理「header()」って実行前になにか表示処理を行っているタイミングで実行するとエラーになりますよね。

もちろんWordpressでもそれは同じことです。

ですのでリダイレクトを実施するにあたって処理のなかでもいち早く実行されるアクションフックを利用しなければなりません。

「template_redirect」のフックは実行のタイミングが非常に早いために、このアクションフックを利用してリダイレクトするとエラーは出ません。

function.phpに以下を追加しますと、有無を言わさずリダイレクトされます。

/**
 * リダイレクト処理
 */

add_action('template_redirect', function() {
        wp_redirect("http://hogehoge/hage/");
});

例えば、Wordpressのユーザーロール(権限)を元に「ログイン済みならばログインページからマイページに遷移」みたいな処理をしたい場合は、以下みたいに書けば良いと思います。

/*
* ユーザーロール(ユーザー権限の取得)
*/
function get_user_roles(){
    $user = wp_get_current_user();
    $user_role =$user->roles;

    if(empty($user_role[0])){

    }else{
        return $user_role[0];
    }
}

/*
* 現在の表示ページのスラッグを取得する
*/
function get_slug(){
    $slug_name = basename(get_permalink());
    return $slug_name;
}

/**
 * リダイレクト処理の例
 */

add_action('template_redirect', function() {
    //ユーザーロールを取得
    $role = get_user_roles();
    //現在アクセス中のページのスラッグを取得
  $now_slug = get_slug();

    //ログインしていないユーザーがhogeにアクセスしたらhageにリダイレクト
    if($now_slug == "hoge" &&  $role == ""){
        wp_redirect($base_url."/hage/");
    }

});

最初にユーザーロールを取得する関数を用意してログインの有無を確認し、その結果と現在のURLを判定してリダイレクトされる、という仕組みです。

なんかもっとスマートに実装できる気がしていますが、寝ぼけた頭ではこんな程度です。