$_POST form request with admin-post

I tried to use a form with the following markup using the action admin-post.php

<form method='post' action='admin-post.php'>

I’m using the action hook suggested by WordPress to proceed the $_POST parameters and it works fine. However after execution I got a blank page and no redirect back to the plugins page. Of course I could set a custom redirect with the referer, but is that the normal behaviour?

A Workaround is to use action="" and and getting the request in my normal plugin code.


Maybe a little late but I stumbled on this when I was having issues figuring it out so thought I would supply what I found out for future people.

I’ve found the basic principles are to have a hidden input named action and it’s value being a custom set identifier. For example

<input name="action" type="hidden" value="custom_form_submit">

With this input, and your forms action pointing to admin-post.php an action can be set. We set this action using admin_post_custom_form_submit.

To make things more complicated we can use a wp_nonce_field which I think is a basic security thingy. Basically it adds a random $_POST value. Fair enough.

Next we want to set our action like so:


So when there is a form submitted to admin-post.php and there is an action value of custom_form_submit the function our_custom_form_function will be called! 😀

function our_custom_form_function(){
    //you can access $_POST, $GET and $_REQUEST values here. 
   //apparently when finished, die(); is required. 

Now you say you get a white page. This is because we need to redirect back to our form. I’ve used a simple wp_redirect()

Hope this has helped 🙂 I’m going to try and figure out how I can do some validation and give errors back to our redirect form. I think the simplest idea would be to make a $_GET value and find that on our page but it’s not great is it?

I’ve also found that once submitted $_POST is cleared!! DX This is probably to do with the redirect. I’ll have a google and see what I can find :d

Hope this has helped 🙂


I done some more work and realised the only real way to return values is to use the $_GET variable. This way you can re-enter any post values. Just don’t forget to use urlencode()to ensure that special characters such as ‘@’ and so on are included.

I had more than one page with what I was working on so I done 2 different redirects to the different pages and included the errors and so on. The checked for them above my form.

Another handy function. http_build_request() can turn arrays into ‘url safe’ arrays so that you can send them over $_GET requests etc.

Leave a Comment