POSTリダイレクトとは
HTTPはステートレスのため、POST送信された値を保持しない。
そのため、POST送信されたページから他のページに移動したときに、そのPOSTデータは破棄される。
POSTリダイレクトは、リダイレクト時に当ページのPOSTデータをそのままリダイレクト先に引き継ぐ(同じように送信する)ことである。
これを使用することで、お問い合わせフォームなどで複雑なルーティング(POST送信のエンドポイントをひとつにして、結果によってリダイレクト先を決定したりなど)を行う場合、セッションを利用せずにエンドポイントに送られたPOSTデータをリダイレクト先に転送することができる。
PardotのフォームなんかはこのPOSTリダイレクトを使っているように思う。
WordPressで実現する方法
さて、その方法だがプログラムを組んだりする必要はなく、特別難しいことはない。
※もちろん、指定したパラメーターのみ抽出して転送する場合などはプログラムを組む必要があるが
WordPressでも素のPHPでも変わらず、リダイレクト時のHTTPステータスコードを 307(Temporary Redirect)にするだけだ。
これだけで、リダイレクト元ページに送信されたPOSTデータをリダイレクト先に引き継ぐことができる。
wp_redirect('https://~', 307);
// PHPの場合は header 関数を使用
exit;
307リダイレクトは厳密にはPOSTデータを転送するのではなく、転送元のリクエストメソッドと本文が変わらないことを保証するステータスコードである。
302(Found)と似ており、302も転送元に送信されたデータを転送するが、同じメソッドで転送されるかどうかが保証されていない(一部の古いクライアントは不正にGETメソッドに変更されることがある)。
転送ではなく、これをより安全に処理するためにGETメソッドへの変換する必要がある場合は、303(See Other)ステータスコードを使用すればいい。
wp_redirect('https://~', 303);
exit;
このステータスコードは通常、PUTあるいはPOSTの結果として送信されている。
上記のコードを使用するシーンとしては、ファイルをアップロードして、そのファイル名を別のページで表示する必要がある場合に、便利に使用できる。