I have a form that users fill out. When they finish, they are redirected to a 3rd party site to set up payment options. After completing the payment process, they are sent back to my site with a variety of $_POST variables.

My plugin needs to create a thank you page based on those POST variables. It's a simple little page with a title and a few paragraphs of text.

I do not want these pages to be stored in the database. They will be unique to each transaction.

I attached a function to init that parses the $_POST data (after sanitizing, of course.) That function creates two global variables: $my_title and $my_content I'm not sure how to turn those into a page for the user, though.

The payment system will send users to www.mysite.com/thank-you

So far, I have a filter on rewrite_rules_array to add my url:

function my_rewrite_rules( $rewrite_rules) {
    $rule = array('thank-you/?$' => 'index.php?formresult=thank-you');
    $rewrite_rules = $rule + $rewrite_rules;
    return $rewrite_rules

I filter query_vars to add mine:

function my_insert_qv($vars) {
    array_push($vars, 'formresult');
    return $vars;

Then, I have an action on template_redirect where I think the action should be. Maybe this is the wrong path.

function my_template_redirect() {
    gloval $wp;
    $qvs = $wp->query_vars;
    if (array_key_exists( 'laundry', $qvs && $qvs['laundry'] == 'thank-you' ) {
        global $wp_query;
        $wp_query->set( 'is_404', false );
        // ... now what?

How can I show the user a page that loads the default page template from the active theme and shows my dynamic title and content?

  • Would you be okay with one page in the WordPress db? If so you could set up a single "thank you" page which uses a custom page template. Put the code in that template to pull in the args from the querystring and display your custom content. – Michelle Sep 13 '11 at 16:11
  • Yeah, that would work. I'm trying to do it all without touching the theme... if that's what has to happen, so be it. But, I'd like it to be one self-contained plugin. – Peter G Sep 13 '11 at 16:21
  • Ah, gotcha. My brain skipped right over the "My plugin needs to..." bit. :) – Michelle Sep 13 '11 at 16:54

Something like this should work, though I'm not sure how meta, title, etc.. will behave, you'll want to test everything thoroughly!

function my_template_redirect() {
    global $wp;
    $qvs = $wp->query_vars;
    if (array_key_exists( 'laundry', $qvs && $qvs['laundry'] == 'thank-you' ) {
        global $wp_query;
        $wp_query->set( 'is_404', false );
        // ... now what?

        $post = new stdClass();
        $post->ID= -99; // fake ID, hehe
        $post->post_content = 'some content';
        $post->post_excerpt = 'an excerpt';
        $post->post_status ='publish';
        $post->post_title = 'My fake page';
        $post->post_type = 'page';
        $wp_query->queried_object = $post;
        $wp_query->post = $post;
        $wp_query->found_posts = 1;
        $wp_query->post_count = 1;
        $wp_query->max_num_pages = 1;
        $wp_query->is_page = 1;
        $wp_query->is_404 = false;
        $wp_query->posts = array($post);
        $wp_query->page = 1;
        $wp_query->is_post = false;

  • That looks like what I need, but it's not quite working for me. Looking at the debug info, I added lines for $post->post_name and $wp_query->queried_object_id. Now the result is it shows the blog index and gives the notice Trying to get property of non-object in .../wp-includes/post-template.php on line 485 It looks to be trying to look up the page with id = -99, which fails. Any ideas? – Peter G Sep 13 '11 at 21:08
  • I tried setting the fake page ID equal to 1. That cleared up the notice, but still just showing the blog index. – Peter G Sep 13 '11 at 21:15
  • @Peter G - sorry, don't know how to fix that, will have to do some tests myself later. – Milo Sep 14 '11 at 1:16
  • Thanks @Milo I've been trying to use it on all sorts of different hooks without luck. It seems like such a simple idea, but apparently not. I'd love an answer to this, but given time constraints I'll likely go the custom template route suggested above sometime tomorrow. – Peter G Sep 14 '11 at 2:08
  • The template method worked out for me and got the job done. I'm accepting this answer because it does show how to set up your own $post & $wp_query variables. – Peter G Sep 17 '11 at 17:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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