Recently I needed to develop a Shortcode that would display a form, this blog post details what I did. I used Ajax ( which seems the best way to add forms to shortcodes, but I’d welcome any input from other developers on your approach).
So without further ado lets get on with adding a form to a shortcode in WordPress.
We need javascript to handle submission of the form via ajax (this presumes you have jquery available), and handle the response from the server. green_form is the form id.
jQuery( document ).ready(function() {
// Handler for .ready() called.
//
jQuery(function(){
jQuery("#green_form").submit(function(event){
event.preventDefault();
var formOk = true;
// do js validation
jQuery.ajax({
url:ajax_object.ajax_url,
type:'POST',
data: jQuery(this).serialize() + "&action=green_do_something",
success:function(response){
if(response=="true")
{
// do something
}
else{
alert('doh something went wrong');
}
}
});
});
});
});
Next we need the php to handle everything else, you could put this in functions.php (or include from functions.php) or put it into a plugin. The shortcode to include the form in our page or post is [shortcode_with_form]
The code handles:
- the output of the shortcode
- the server side processing of the form (I’ve just created a stub in this example ( function do_something_serverside )
- and the including of javascript file required ( if you’d like to know abit depth on ajax forms in WordPress see my post on that )
$greenShortyExample = new GreenShortyExample();
class GreenShortyExample {
public function __construct() {
$this->attach_actions();
$this->attach_shortcodes();
}
function attach_actions() {
add_action('wp_ajax_nopriv_green_do_something', array($this, 'do_something_serverside'));
add_action('wp_ajax_green_do_something', array($this, 'do_something_serverside')); /* notice green_do_something appended to action name of wp_ajax_ */
add_action('wp_enqueue_scripts', array($this, 'theme_enqueue_styles'), 99999);
}
function theme_enqueue_styles() {
/*
* include the js
*/
wp_enqueue_script('green-script', plugin_dir_url(__FILE__) . '../js/ajax_call_to_handle_form_submit.js', array('jquery'));
// in JavaScript, object properties are accessed as ajax_object.ajax_url, ajax_object.we_value
wp_localize_script('green-script', 'ajax_object', array('ajax_url' => admin_url('admin-ajax.php'), 'we_value' => 1234));
}
function do_something_serverside() {
echo "true"; // output to ajax call
die();
}
function attach_shortcodes() {
add_shortcode('shortcode_with_form', array($this, 'shortcode_with_form_code'));
}
function shortcode_with_form_code($atts, $content = null) {
if ($this->formOk()) {
return " <div>thanks your form has been submitted</div>";
} else {
return $this->show_form();
}
}
function show_form() {
$form = '
<form id="green_form" action="">
field1:<br>
<input type="text" name="field1" value="">
<br>
field2:<br>
<input type="text" name="field2" value="">
<br>
<br>
<input type="submit" value="Submit" >
</form>
';
return $form;
}
function formOk(){
return true; // use session or something to check
}
}
Hope you find this interesting if you’re looking to add a form to a shortcode.