¿Crear plantillas de página personalizadas con complementos?

Respuestas:

73

get_page_template()se puede anular a través del page_templatefiltro. Si su complemento es un directorio con las plantillas como archivos en ellas, solo es cuestión de pasar los nombres de estos archivos. Si desea crearlos "sobre la marcha" (¿editarlos en el área de administración y guardarlos en la base de datos?), Puede escribirlos en un directorio de caché y consultarlos, o conectarlos template_redirecty hacer algunas eval()cosas locas .

Un ejemplo simple para un complemento que "redirige" a un archivo en el mismo directorio de complementos si cierto criterio es verdadero:

add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'my-custom-page-slug' ) ) {
        $page_template = dirname( __FILE__ ) . '/custom-page-template.php';
    }
    return $page_template;
}
Jan Fabry
fuente
Hola Jan, ¿tienes algún código de ejemplo sobre cómo pasar un archivo de complemento como una plantilla de página personalizada?
jnthnclrk
@trnsfrmr: Es realmente fácil, agregué un ejemplo simple a mi respuesta.
Jan Fabry
10
Tenga en cuenta que esto ha sido más o menos reemplazado por el filtro "template_include" en versiones posteriores (3.1+).
Inigoesdr
Perfecto !!!, me has ahorrado tiempo @JanFabry
Kishan Chauhan
Como lo indicó @fireydude, esta no es una solución genérica. Es una solución alternativa que codifica la babosa de la página.
Mauro Colella
22

Anular get_page_template()es solo un truco rápido. No permite que la plantilla se seleccione desde la pantalla de administración y la ficha de la página está codificada en el complemento, 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 le permite registrar una plantilla de página en el back-end desde el complemento. Entonces funciona como cualquier otra plantilla.

 /*
 * Initializes the plugin by setting filters and administration functions.
 */
private function __construct() {
        $this->templates = array();

        // Add a filter to the attributes metabox to inject template into the cache.
        add_filter('page_attributes_dropdown_pages_args',
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the save post to inject out template into the page cache
        add_filter('wp_insert_post_data', 
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the template include to determine if the page has our 
        // template assigned and return it's path
        add_filter('template_include', 
            array( $this, 'view_project_template') 
        );

        // Add your templates to this array.
        $this->templates = array(
                'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
        );
}
fireydude
fuente
Sería bueno ( y preferido ) si puede publicar el código relevante desde el enlace en su respuesta, de lo contrario, esto no es más que un comentario hinchado :-)
Pieter Goosen
El tutorial en realidad acredita el ejemplo de Tom McFarlin como el creador de este enfoque.
fireydude
7

Sí, es posible. Este complemento de ejemplo me pareció muy útil.

Otro enfoque que se me viene a la cabeza es utilizar la API del sistema de archivos WP para crear el archivo de plantilla para el tema. No estoy seguro de que sea el mejor enfoque, ¡pero estoy seguro de que funciona!

Ari
fuente
El complemento de ejemplo vinculado está incluso bastante bien documentado. Me gusta eso. :)
Arvid
0

Ninguna de las respuestas anteriores funcionaba para la mía. Aquí uno donde puedes elegir tu plantilla en el administrador de Wordpress. Simplemente colóquelo en su archivo de complemento php principal y cámbielo template-configurator.phppor el nombre de su plantilla

//Load template from specific page
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;
}

/**
 * Add "Custom" template to page attirbute template section.
 */
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 ) {

    // Add custom template named template-custom.php to select dropdown 
    $post_templates['template-configurator.php'] = __('Configurator');

    return $post_templates;
}
Dessauges Antoine
fuente