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

有帮助吗?

解决方案

Found the answer (via)

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

<?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;
    }
}     
?>

其他提示

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

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();//....
}
});

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.

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

许可以下: CC-BY-SA归因
scroll top