Devolver una plantilla HTML con función PHP
Quiero crear un formulario que pueda insertar en mi sitio usando un shortcode.
Sería muy útil poder crear la parte HTML en un archivo separado e insertarlo con un shortcode PHP (para separar la lógica de la página de la mecánica de convertirlo en un shortcode).
¿Cómo podría hacer esto?
-- Actualización --
Esto es lo que he hecho: Tengo dos archivos. Uno llamado 'profiletemplate.php' y otro llamado 'scodes'. Ambos son parte de un plugin que estoy creando para mi sitio con un init.php que los inicializa. Aquí está su contenido:
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 // Plantilla para mi shortcode de formulario ?>
<form>
Prueba
</form>
Luego uso el shortcode [testfield] en una página de mi sitio.
Actualización 2
Este método está funcionando, pero no está insertando el HTML donde se llama al shortcode. En su lugar, está insertando el contenido en la parte superior de la página (como si hubiera usado 'echo 'Prueba'' en lugar de 'return 'Prueba'' en una función).

Algo que olvidé mencionar en mi comentario anterior es que los shortcodes devuelven contenido, tanto la sugerencia include
como mi alternativa get_template_part
mostrarán directamente el contenido (que es lo que estás viendo con el contenido que aparece en la parte superior de tu página en lugar de donde se llama al shortcode). Para contrarrestar esto debemos usar buffering de salida.
Define el shortcode en tu functions.php (o en el archivo de funciones específicas del sitio).
function my_form_shortcode() {
ob_start();
get_template_part('my_form_template');
return ob_get_clean();
}
add_shortcode( 'my_form_shortcode', 'my_form_shortcode' );
Luego, en la carpeta de tu tema necesitas un archivo llamado my_form_template.php
que se cargará en cualquier lugar donde coloques el shortcode.

Si intentas hacer lo mismo dentro de un plugin, necesitas usar include. Mira http://wordpress.stackexchange.com/a/124794/75817

Agrega lo siguiente a tu archivo functions.php:
function my_form_shortcode() {
include dirname( __FILE__ ) . 'my_form_template.php';
} // función my_form_shortcode
add_shortcode( 'my_form_shortcode', 'my_form_shortcode' );
Archivo my_form_template.php:
<?php // Plantilla para el shortcode de mi formulario ?>
<form ...>
CAMPOS
</form>

También podrías usar get_template_part()
dentro de tu función de shortcode.

Intenté implementar la solución de @t f - agregué una actualización a mi publicación sobre esto

Consulta el codex para obtener una descripción de get_template_part() y mira mi respuesta para saber cómo usarlo junto con tu shortcode.

Intenta poner todo tu código dentro de ob_start();
y return ob_get_clean();
y eso resolverá el problema de que el contenido del shortcode aparezca en la parte superior porque ob_
es un buffer que captura todo el código previo, ejecuta tus operaciones y luego continúa donde se detuvo.
Ejemplo completo:
function subscribe_model_fn(){
ob_start();
// tu código en un archivo separado, feliz y organizado
include(locate_template( 'library/general/subscribe_model.php',false,true));
return ob_get_clean();
}
add_shortcode('subscribe_model', 'subscribe_model_fn');
