¿Crear plantillas de página personalizadas con plugins?

28 oct 2010, 20:04:20
Vistas: 122K
Votos: 84

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

0
Todas las respuestas a la pregunta 4
5
92

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;
}
2 nov 2010 15:52:24
Comentarios

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

jnthnclrk jnthnclrk
16 nov 2010 19:58:46

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

Jan Fabry Jan Fabry
16 nov 2010 21:46:14

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

Daniel R Daniel R
10 jun 2013 18:54:10

¡Perfecto!!!, me has ahorrado tiempo @JanFabry

Kishan Chauhan Kishan Chauhan
21 dic 2018 16:02:14

Como mencionó @fireydude, esta no es una solución genérica. Es una solución alternativa que codifica de forma rígida el slug de la página.

Mauro Colella Mauro Colella
8 jul 2019 00:18:25
2
31

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',
        );
}
12 oct 2015 14:29:34
Comentarios

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 :-)

Pieter Goosen Pieter Goosen
12 oct 2015 14:32:32

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

fireydude fireydude
12 oct 2015 14:53:34
1
16

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;
}
22 oct 2019 11:21:25
Comentarios

Esta es la forma correcta de hacerlo.

Muhammad Zohaib Muhammad Zohaib
26 ago 2023 11:52:32
1

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!

4 dic 2014 17:37:08
Comentarios

El plugin de ejemplo vinculado está bastante bien documentado. Me gusta eso. :)

Arvid Arvid
14 ago 2017 17:46:58