【WordPressで安全なリダイレクトの処理ができるという関数「wp_safe_redirect」】

WordPressのコメント欄のあたりをずっと触っているのですが、わからないことというか、知らない関数がたくさんありますね。

「wp-comments-post.php」のコードの最後らへんを覗きました

例えば、投稿されたコメントを保存する処理などは「wp-comments-post.php」に書いてあったりするんですが、その最後らへんに、

・・・(省略)
$location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;
$location = apply_filters('comment_post_redirect', $location, $comment);
wp_safe_redirect( $location );
exit;

ってコードがあります。

上のコード中にある「wp_safe_redirect( $location );」が今回の話題にしたいところです。周辺のコードについては今回は省略いたしますが、処理がひととおり終わったら、特定のURL($locationに格納されているURL)にリダイレクトされるようですね。

「wp_safe_redirect」

Codexの「Function Reference/wp safe redirect」を参考にいたしますと、名前の通り「安全にリダイレクトする」関数みたいですかね。

<?php wp_safe_redirect( $location, $status ); ?>

パラメーター

$location → リダイレクトさせるURLを入れる

$status → HTTPステータスコードを入れる(オプションで、デフォルトは「302」)

HTTPステータスコード302について

HTTPステータスコードについてはこちら「HTTPステータスコード」に詳しく書いてあります。「302」については、以下のように解説されています。

リクエストしたリソースが一時的に移動されているときに返される。

Location:ヘッダに移動先のURLが示されている。元々はMoved Temporarily(一時的に移動した)で、本来はリクエストしたリソースが一時的にそのURLに存在せず、別のURLにある場合に使用するステータスコードであった。

しかし、例えば掲示板やWikiなどで投稿後にブラウザを他のURLに転送したいときにもこのコードが使用されるようになったため、302はFoundになり、新たに303,307が作成された。

wp_safe_redirectの中身(WordPress3.5.1の場合)

wp_safe_redirectがどんな処理をしているか、というのは「wp-includes/pluggable.php」に以下のようにあります。

if ( !function_exists('wp_safe_redirect') ) :
 function wp_safe_redirect($location, $status = 302) {
 // Need to look at the URL the way it will end up in wp_redirect()
 $location = wp_sanitize_redirect($location);
 $location = wp_validate_redirect($location, admin_url());
 wp_redirect($location, $status);
}
endif;

すごく単純にですが、「wp_sanitize_redirect」でリダイレクトさせようとするURLをサニタイズして「wp_validate_redirect」でさらにそのURLをバリデートして、最後の処理として「wp_redirect」でリダイレクト処理をしているという事ですかね。

まとめ

今回の「wp-comment-post.php」での「wp safe redirect」の使用例ですと、コメント投稿・保存などの処理が一通り終了したら、一時的な移動として利用される302リダイレクトが設定されているんだなぁと理解しました。なるほど~って感じです。

ところで、これって301リダイレクトとかも使えるってことですかね。そうだったら、サーバ移転などの時に、ちょっと使えそうだなぁなんて思いました。(恒久的なリダイレクトができるという意味で、です)

著者:bouya Imamura