web-dev-qa-db-fra.com

wp_redirect () ne fonctionne pas sur la soumission de formulaire avec init hook

J'essaie de rediriger l'utilisateur après la soumission du formulaire à l'aide de wp_redirect() mais cela ne fonctionne pas.

Je soumets des données en utilisant le crochet d'action init. voici le code.

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

Le problème avec votre code est assez simple. Vous ne terminez pas l'exécution du script après avoir effectué la redirection. Donc, l'en-tête sera défini, mais le navigateur l'ignorera.

Si vous allez jeter un oeil à référence du code WP , il est clairement indiqué

Remarque: wp_redirect () ne se ferme pas automatiquement et devrait presque toujours être suivi d'un appel à quitter.

Donc, tout ce que vous avez à faire est de changer votre code comme suit:

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 Presque toujours, il sera bon d’ajouter une barre oblique à l’URL vers laquelle vous redirigez. Sinon, WP effectuera une autre redirection pour ajouter cette barre oblique.

PPS. En outre, il serait beaucoup plus agréable d'utiliser admin_post hook au lieu de initpour traiter les requêtes POST.

1
Krzysiek Dróżdż