Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I am attempting to learn PHP by creating a relatively simple application built on wordpress, it is a basic CRM and I've made decent progress but have been stuck on some of the finer points.

I've been having some serious 'headers already sent' problems with getting wp_redirect() working after a user creates a new customer.

Here is an example of what I want to do:

  • /new-customer.php : Create a new Custom Post Type via the front end and then redirect to that particular customer's single post page. Here is the code:

        <?php
            $address_line_1      = $_POST['address_line_1'];
            $address_line_2      = $_POST['address_line_2'];
            $suburb              = $_POST['suburb'];
            $state               = $_POST['state'];
            $post_code           = $_POST['post_code'];
            $country             = $_POST['country'];
            $email               = $_POST['email'];
            $first_name          = $_POST['first_name'];
            $last_name           = $_POST['last_name'];
            $phone_number        = $_POST['phone_number'];
            $progress_identifier = '1';
    
                // PROCESS THE FORM
                if ('POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['action']) && $_POST['action'] == "new_customer")
                {
    
                    $new_customer = array(
                        'post_title'  => wp_rand(100,999).'-'.wp_rand(),
                        'post_author' => $user_ID,
                        'post_status' => 'publish',
                        'post_type'   => 'customer'
                    );
    
                    $pid = wp_insert_post($new_customer);
    
                    add_post_meta($pid, 'address_line_1',      $address_line_1,      true);
                    add_post_meta($pid, 'address_line_2',      $address_line_2,      true);
                    add_post_meta($pid, 'suburb',              $suburb,              true);
                    add_post_meta($pid, 'state',               $state,               true);
                    add_post_meta($pid, 'post_code',           $post_code,           true);
                    add_post_meta($pid, 'country',             $country,             true);
                    add_post_meta($pid, 'email',               $email,               true);
                    add_post_meta($pid, 'first_name',          $first_name,          true);
                    add_post_meta($pid, 'last_name',           $last_name,           true);
                    add_post_meta($pid, 'phone_number',        $phone_number,        true);
                    add_post_meta($pid, 'address',             $address,             true);
                    add_post_meta($pid, 'progress_identifier', $progress_identifier, true);
    
                    $survey_post = array(
                        'post_title' => $pid . '-' . wp_rand(),
                        'post_author' => $user_ID,
                        'post_status' => 'publish',
                        'post_type' => 'survey'
                    );
    
                    $survey_id = wp_insert_post($survey_post);
    
                    global $wpdb;
                    $wpdb->insert(
                        $wpdb->p2p,
                        array(
                            'p2p_from' => $survey_id,
                            'p2p_to' => $pid,
                            'p2p_type' => 'survey_to_customer'
                        )
                    );
                    wp_redirect(home_url());
                    exit();
                }
        ?>
    

This code is placed after the HTML form.

I know wp_redirect() has to be called before the page starts outputting anything but I am unsure how to make that happen because I have tried putting it further up in the page but it doesn't get me anywhere.

Feel free to abuse me for the terrible code and ambiguous question but if you could possibly point me in the right direction to accomplish what I am trying to achieve that would be great! I have tried to break things up into functions to get called via the 'save_post' hook but no luck with that either.

Thanks for reading!

share|improve this question

2 Answers 2

you should call an

exit;

after wp_redirect and you should save the post data in pre_get_posts hook.

share|improve this answer
    
My bad! I did have the exit(); in there afterwards it was just some bad copy/paste on my part. This code still gives me a "headers already sent" error though? I will have a look into the pre_get_posts hook, is this related to the redirect functioning correctly or for best practice/security? Many thanks for your assistance! –  Wattsy Feb 10 '13 at 7:55
    
this is a best practice. Get pre_get_posts hook triggers before a proper posts query request to the DB is done a though you can save data to the DB and afterthat redirect to the home without fetching any data over the necessary limit. This hook is also triggerd before any output. –  david.binda Feb 10 '13 at 10:54
    
Thanks for your help David! I'm having trouble finding information on creating post types with the pre_get_posts hook, most describe displaying posts with it. I have tried wrapping the above code in a function and calling it with: add_action('pre_get_posts','create_new_customer'); But it doesn't create the post, I'm assuming it has something to do with the $query variable passed to the function. I apologise if this isn't making sense, as you can probably tell I'm new to working with hooks. Cheers! –  Wattsy Feb 10 '13 at 14:37

You should keep the form on new-customer.php and set the form action to POST to another script (something like new-customer-process.php) and then paste your PHP code into that script. Essentially the user won't know any different as they will be redirected back to the home page.

To give you a little more information, the form is what is sending the headers which is why you need to separate out the form and the processing script. The redirect needs to be BEFORE any HTML is sent.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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