I want to create a form that I can use a shortcode to insert into my site.
It would be really nice if I could create the HTML part in a seperate file and then insert it with a PHP shortcode (to seperate the logic of the page from the mechanics of making it into a shortcode).
How could I do this?
— Update —
This is what I’ve done:
I have two files. One called ‘profiletemplate.php’ and one called ‘scodes’. They are both part of a plugin that I am making for my site with an init.php that initializes them. Here is their content:
init.php
<?php
require_once(dirname(__FILE__).'/pages/scodes.php');
?>
scodes.php
function jf_testcode() {
include dirname(__FILE__) . 'profiletemplate.php';
}
add_shortcode('testfield', 'jf_testcode');
profiletemplate.php
<?php // Template for my form shortcode ?>
<form>
Testing
</form>
I then use the [testfield] shortcode on a page in my site.
Update 2
So this method is working, but it isn’t inserting the HTML where the shortcode is called. Instead it is just inserting the content at the top of the page (like if I said ‘echo ‘Testing” instead of ‘return ‘Testing” in a function.
Something I forgot in my previous comment was that shortcodes return content, both the suggested
include
and my alternativeget_template_part
will directly output the content (which is what you are seeing with the content appearing at the top of your page instead of where the shortcode is called). To counteract this we must use output buffering.Define the shortcode in your functions.php (or your site’s site-specific functions file).
Then in your theme folder you need a file called
my_form_template.php
which will be loaded anywhere you place the shortcode.Add the following to your functions.php:
File my_form_template.php:
try to put all your code inside
ob_start();
andreturn ob_get_clean();
and that will solve the problem of the short code content appear at the top because
ob_
is a buffer so it get all the prev code do your stuff then continue where its stopped .full example .