¿Crear plantillas de página personalizadas con plugins?
¿Es posible hacer que las plantillas de página personalizadas estén disponibles desde un plugin?

La función get_page_template()
puede ser modificada mediante el filtro page_template
. Si tu plugin es un directorio que contiene las plantillas como archivos, simplemente necesitas pasar los nombres de estos archivos. Si deseas crearlas "al vuelo" (editarlas en el área de administración y guardarlas en la base de datos), podrías escribirlas en un directorio de caché y hacer referencia a ellas, o engancharte a template_redirect
y hacer algunas locuras con eval()
.
Un ejemplo simple para un plugin que "redirige" a un archivo en el mismo directorio del plugin si se cumple cierto criterio:
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
if ( is_page( 'mi-slug-de-pagina-personalizada' ) ) {
$page_template = dirname( __FILE__ ) . '/plantilla-de-pagina-personalizada.php';
}
return $page_template;
}

Hola Jan, ¿tienes algún código de ejemplo sobre cómo pasar un archivo de plugin como una plantilla de página personalizada?

@trnsfrmr: Es muy sencillo, he añadido un ejemplo simple a mi respuesta.

Ten en cuenta que esto ha sido más o menos reemplazado por el filtro "template_include" en versiones posteriores (3.1+).

Sobrescribir get_page_template()
es solo una solución rápida. No permite seleccionar la plantilla desde la pantalla de Administración y el slug de la página está codificado directamente en el plugin, por lo que el usuario no tiene forma de saber de dónde viene la plantilla.
La solución preferida sería seguir este tutorial que te permite registrar una plantilla de página en el back-end desde el plugin. Entonces funciona como cualquier otra plantilla.
/*
* Inicializa el plugin configurando filtros y funciones de administración.
*/
private function __construct() {
$this->templates = array();
// Añade un filtro al metabox de atributos para inyectar la plantilla en la caché.
add_filter('page_attributes_dropdown_pages_args',
array( $this, 'register_project_templates' )
);
// Añade un filtro al guardar el post para inyectar nuestra plantilla en la caché de página
add_filter('wp_insert_post_data',
array( $this, 'register_project_templates' )
);
// Añade un filtro para incluir la plantilla y determinar si la página tiene nuestra
// plantilla asignada y devolver su ruta
add_filter('template_include',
array( $this, 'view_project_template')
);
// Añade tus plantillas a este array.
$this->templates = array(
'goodtobebad-template.php' => 'Es Bueno Ser Malo',
);
}

Sería genial (y preferible) si pudieras publicar el código relevante del enlace en tu respuesta, de lo contrario esto no es más que un comentario inflado :-)

El tutorial en realidad acredita el ejemplo de Tom McFarlin como el creador de este enfoque.

Ninguna de las respuestas anteriores funcionó para mí. Aquí hay una donde puedes elegir tu plantilla en el administrador de Wordpress. Solo colócalo en tu archivo principal de plugin php y cambia template-configurator.php
por el nombre de tu plantilla
//Cargar plantilla desde una página específica
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){
if ( get_page_template_slug() == 'template-configurator.php' ) {
$page_template = dirname( __FILE__ ) . '/template-configurator.php';
}
return $page_template;
}
/**
* Añadir plantilla "Personalizada" a la sección de atributos de página.
*/
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {
// Añadir plantilla personalizada llamada template-custom.php al menú desplegable
$post_templates['template-configurator.php'] = __('Configurador');
return $post_templates;
}

Sí, es posible. Encontré este plugin de ejemplo muy útil.
Otro enfoque que se me ocurre es usar la API de WP Filesystem para crear el archivo de plantilla en el tema. No estoy seguro de que sea el mejor enfoque a tomar, ¡pero estoy seguro de que funciona!
