wp_redirect()
を使用してフォーム送信後にユーザーをリダイレクトしようとしていますが、機能していません。
init
アクションフックを使用してデータを送信しています。ここにコードがあります。
function ab_process_application_form()
{
if (isset($_POST['new_application']) && isset($_POST['ab_application_nonce'])) {
if (wp_verify_nonce($_POST['ab_application_nonce'], 'ab_application_form_nonce')) {
// all $_POST and validation code
...
// add record to database
$insert_id = $db->insert($data, $format);
// trigger action after form submit
do_action('ab_application_submitted', $insert_id, $firstname, $lastname, $post_campaign);
// redirect after form submitted
wp_redirect(home_url('/application/thank-you'));
} else {
echo 'Not Verified';
} // end nonce verification
} // end check
} // end of function
// submit record on init hook
add_action('init', 'ab_process_application_form');
コードの問題は非常に単純です。リダイレクトを行った後、スクリプトの実行を終了しません。そのため、ヘッダーは設定されますが、ブラウザーはそれを無視します。
WP Code Reference を見ると、明確に述べられています:
注:wp_redirect()は自動的には終了せず、ほとんどの場合、exitの呼び出しが続く必要があります。
そのため、コードを次のように変更するだけです。
function ab_process_application_form()
{
if (isset($_POST['new_application']) && isset($_POST['ab_application_nonce'])) {
if (wp_verify_nonce($_POST['ab_application_nonce'], 'ab_application_form_nonce')) {
// all $_POST and validation code
...
// add record to database
$insert_id = $db->insert($data, $format);
// trigger action after form submit
do_action('ab_application_submitted', $insert_id, $firstname, $lastname, $post_campaign);
// redirect after form submitted
wp_redirect(home_url('/application/thank-you'));
exit; // <-- this is the only change you need to do
} else {
echo 'Not Verified';
} // end nonce verification
} // end check
} // end of function
// submit record on init hook
add_action('init', 'ab_process_application_form');
PS。ほとんどの場合、リダイレクト先のURLに末尾のスラッシュを追加することをお勧めします。それ以外の場合、WPはこのスラッシュを追加するためにもう1つのリダイレクトを実行します。
PPS。また、init
の代わりに admin_post
フックを使用してPOSTリクエストを処理すると、さらに優れたものになります。