web-dev-qa-db-ja.com

wp_redirect()がinitフックを使用したフォーム送信で機能しない

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');
1
pixelngrain

コードの問題は非常に単純です。リダイレクトを行った後、スクリプトの実行を終了しません。そのため、ヘッダーは設定されますが、ブラウザーはそれを無視します。

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リクエストを処理すると、さらに優れたものになります。

1