15

I am trying to use wp_redirect() to redirect the user after successfully submitting a signup form on the page.

It's not working and shows the following error:

Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/theme/wp-content/themes/test/header.php:10) in /Applications/MAMP/htdocs/theme/wp-includes/pluggable.php on line 1178

I understand there has been already output before, that's why it's not working, but I have no clue how to make this work.

The signup form gets rendered by a function, and is submitted by another function, inside my functions.php.

if ( isset( $_POST['subscribe'] ) ) {
    // Submits the form and should then redirect
    wp_redirect("/thank-you/");
    exit;
}

Then both these functions are used where I want to show the signup form.

I'm afraid that's not the best thing to do. I should be creating some action that does that, but I have no idea how to implement that. Most of the tutorials I found show the results directly on the same page and don't require an additional redirect. Maybe that's why they are working with functions inside the functions.php

5 Answers 5

22

Found the answer (via)

Instead of using the function directly, I added an action to "wp_loaded", that makes sure that it gets loaded before any headers are sent.

<?php
add_action ('wp_loaded', 'my_custom_redirect');
function my_custom_redirect() {
    if ( isset( $_POST['subscribe'] ) ) {
        $redirect = 'http://example.com/redirect-example-url.html';
        wp_redirect($redirect);
        exit;
    }
}     
?>
1
  • It got rid of the error but the post did not save! Feb 23, 2017 at 14:24
13

You have to use wp_redirect() before get_header() Then it will not show header error.

6

you can also do this

Instead of the below line

wp_redirect("$url");

write

echo("<script>location.href = '".$url."'</script>");

or

<?php <script><?php echo("location.href = '".$url."';");?></script>?>

It'll definitely solve your problem.

2
3
add_action('template_redirect', function(){
if(isset($_POST['subscriptio'])){// make this condition such that it only matches when a registraiotn form get submitted
/**
 * do your stuff here
 */
wp_redirect();//....
}
});
2
  • Thanks for the help, but that code didn't worked for me. Needed to add the action to "wp_loaded" to get it worked (See my answer)
    – Snowball
    Feb 23, 2015 at 12:09
  • Works well if you need to establish is_page_template() when conditionally redirecting. Apr 2, 2020 at 5:09
1

If you are creating a plugin, you can call ob_start(); at the beginning of the plugin code or ob_start(); at the top of the functions.php file before code begins

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.