¿Cómo puedo agregar una opción a la lista de plantillas de página desde un complemento?

10

He estado buscando durante las últimas dos horas una forma de crear una plantilla de página personalizada desde un complemento, pero aún no he tenido suerte.

Lo que estoy tratando de hacer específicamente es agregar una opción a la lista de plantillas de página disponibles al editar una página, y no usar algún otro método como if( is_page( 'page-slug' ) ) { /* etc */ }

¿Existe una variable global que pueda modificar para hacer esto?

Editar:

Actualmente estoy usando este código, basado en el enlace que @m0r7if3r me dio en un comentario, el problema es que ejecutará esta función cuando vea la página, pero no cuando edite la página (para completar la lista desplegable con el plantillas de página):

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

Edición 2:

Parece que esta funcionalidad se lanzará en una actualización futura, leí varias entradas de Trac sobre esto y ha habido cierta discusión, pero ninguna respuesta real (con la esperanza de 3.4). Enumeraremos las URL de las entradas de trac aquí en un momento.

Edición 3:

El código anterior funciona, PERO, el único problema que tengo en este momento es que no se agrega ninguna plantilla a la lista desplegable al editar / agregar una nueva página. Estoy intentando algunas cosas y actualizaré mi pregunta pronto.

    
pregunta Jared 13.02.2012 - 05:20

6 respuestas

4

¿Filtros? ¿Alguien?

No hay no filtro para ayudar: page_template_dropdown($template); se usa para generar el menú desplegable y no se puede filtrar.

¿Se está introduciendo furtivamente en la matriz de plantillas?

Para crear los contenidos desplegables, el meta box principal usa get_page_templates() . Desde dentro, la función se parece a la siguiente:

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

Pero cuando se busca en get_themes(); , entonces no hay posibilidad de interceptar la lista de plantillas. Además, tenemos el problema, que no hay posibilidad de obtener una plantilla fuera del directorio de temas ...

... ¡Fingiendo un tema!

La teoría y sus inconvenientes ...

Puede usar register_theme_directory() para agregar un directorio de tema adicional donde pueda colocar plantillas. Así que lo más fácil sería registrar su plugin como carpeta de temas también:

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

Nota: aquí es donde no estoy seguro de si funcionará .

Durante la activación del complemento: Luego, debe colocar un archivo style.css.php dentro de su carpeta templates . Esto le permitiría agregar variables a su archivo. Esta variable sería entonces el tema principal. Y el tema principal debería ser simplemente el tema actualmente activo. Luego actualice su tema activo a su complemento.

Inconveniente # 2: Acerca de la "apariencia« IU ... Tal vez agregue una nota que este "Tema" no debe utilizarse como un tema real. Dejo el resto de "Evitar activar este tema" hasta tu imaginación. De todos modos: debería funcionar.

Inconveniente # 2: Este truco evitará con éxito temas infantiles. Se le permite tener un tema principal. Nada más.

    
respondido por el kaiser 13.02.2012 - 11:00
2

Como sugerencia para una solución alternativa, ¿ha considerado usar el sistema de archivos de WordPress para escribir un archivo de plantilla de página desde su complemento a su directorio de tema activo actual? Dependiendo del control que desee sobre este proceso, puede hacer que su complemento escriba el archivo en la activación y lo elimine en la desinstalación. Alternativamente, podría crear archivos de plantilla de página dinámicamente desde su interfaz de usuario de plugin utilizando un formulario para pasar ciertos valores, como el nombre de la plantilla de página, que aparecerá en el cuadro desplegable de la pantalla de edición posterior. En teoría, también puede eliminar la plantilla de página desde la IU de su complemento con solo hacer clic en un botón y, de manera similar, agregar múltiples plantillas para diferentes propósitos. Hay una buena publicación sobre el uso del sistema de archivos en el blog de Otto. No tengo el enlace conmigo ahora, pero puedes buscarlo.

Espero que liberen lo que pretendías hacer como un gancho en la próxima versión principal.

    
respondido por el userabuser 22.02.2012 - 21:22
1

Hojeé la fuente y, sorprendentemente, ¡no parece haber una manera de hacer esto! Mi truco sugerido sería agregar un segundo cuadro de meta con una anulación de tema / segundo menú desplegable de temas. Luego enganche en este filtro:

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

para devolver tu archivo de tema si se ha invalidado. Por supuesto, solo querría agregar / filtrar si es la publicación que desea.

Si desea ser elegante, puede desechar la caja original y volver a crearla (por supuesto, mediante filtros, sin modificar el código del núcleo).

También sugeriría que se agregue un ticket de trac solicitando esa funcionalidad (si no hay una ya disponible) ).

    
respondido por el Matthew Boynes 13.02.2012 - 06:53
1

Lo he logrado en el pasado al eliminar la plantilla de página predeterminada metabox y luego agregar tu propia metabox. Hice que el nuevo metabox usara get_page_templates integrado y luego agregué los otros que necesitaba programáticamente. Al guardarlo, puede actualizar la plantilla de la página como lo hace wordpress.

    
respondido por el gruvii 13.03.2012 - 04:16
1

Revise el gancho theme_page_templates , usado por la función get_page_templates , filtro agregado desde la versión 3.9 actualizada en 4.4:

apply_filters( 'theme_page_templates', $page_templates, $this, $post );
    
respondido por el William Gu 20.06.2016 - 10:35
-2

Resultado de búsqueda con DuckDuckGo agregar una plantilla de página de wordpress la respuesta para mí en una página de wpmu.org titulada Tutorial de plantilla de página personalizada de WordPress .

Esencialmente, dentro del directorio de temas, wp-content / themes / your-theme , copie una plantilla de página existente a un nuevo nombre de archivo php de su elección. Edite el nuevo archivo, teniendo cuidado de cambiar el valor de la propiedad mágica "Nombre de la plantilla:" en el comentario en la parte superior del archivo.

Eso fue todo lo que había que hacer. Es posible que esta sea una característica que publique la pregunta después de las fechas. Estoy usando WP 3.5 con el tema twenty_eleven.

También es posible que haya formas más limpias de extender un tema. Ediciones como esta pueden ser sobrescritas por las actualizaciones del tema. Mea Culpa.

    
respondido por el Douglas Lovell 24.01.2013 - 04:35

Lea otras preguntas en las etiquetas