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
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! :D
//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
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.