Agregar elementos a la plantilla de página desplegable en la pantalla Editar página

4

Estoy desarrollando un tema WP con enfoque MVC. Solo tiene index.php , functions.php y styles.css en el directorio principal. Por lo tanto, no quiero colocar plantillas de página en él, sino que deseo proporcionarlas mediante programación desde Ver clases, mientras que la funcionalidad desde la pantalla de edición permanece igual.

Los usuarios deben tener la opción de selección de plantillas de página en la pantalla de edición. ¿Cómo agrego con éxito artículos a la lista desplegable de plantillas?

Intenté enlazar con theme_page_templates filtro.

Código de ejemplo:

add_filter( 'theme_page_templates', function($templates){

    $templates['my-page-template.php'] = "My Page Template";

    return $templates;

});

Esto no funciona debido al uso de array_intersect_assoc() en el filtro matriz, que elimina el elemento de plantilla de página agregado. No entiendo por qué se utiliza esta función. Parece que solo puedes eliminar la plantilla de página de la lista pero no puedes agregar una nueva usando el filtro dado.

¿Hay alguna otra manera?

    
pregunta Sisir 07.08.2015 - 18:00

2 respuestas

5

Pensé que te daría otro enfoque. También es un poco intrincado, pero es de propósito general y le permite simplemente registrar el nombre de archivo y la etiqueta que desea usar, de este modo:

if ( class_exists( 'WPSE_196995_Page_Templates' ) ) {   
    WPSE_196995_Page_Templates::register_page_template(
        'My Page Template',
        'my-page-template.php'
    );
}

Puedes agregar el código anterior al archivo functions.php de tu tema.

Para habilitar lo anterior, realmente implementé una clase autocontenida que podría usarse como un complemento o simplemente copiarse en functions.php :

<?php   
/**
 * Plugin Name: WPSE 196995 Page Templates
 *
 * Class WPSE_196995_Page_Templates
 *
 * Allows registering page templates via code.
 */
class WPSE_196995_Page_Templates {

    static $registered_templates = array();

    static function on_load() {

        /**
         * Add registered page templates to 'page_template' cache.
         * @note This hook is called just before page templates are loaded
         */
        add_action( 'default_page_template_title', array( __CLASS__, '_default_page_template_title' ) );
    }

    /**
     * Register page templates
     *
     * @param string $label
     * @param string $filename
     */
    static function register_page_template( $label, $filename ) {

        self::$registered_templates[ $filename ] = $label;

    }

    /**
     * Add registered page templates to 'page_template' cache.
     *
     * @param string $title
     *
     * @return string mixed
     */
    static function _default_page_template_title( $title ) {

        /**
         * @var WP_Theme $theme
         */
        $theme = wp_get_theme();

        /**
         * Access the cache the hard way since WP_Theme makes almost everything private
         */
        $cache_hash = md5( $theme->get_stylesheet_directory() );

        /**
         * Get the page templates as the 'page_templates' cache will already be primed
         */
        $page_templates = wp_cache_get( $key = "page_templates-{$cache_hash}", $group = 'themes' );

        /**
         * Add in registered page templates
         */
        $page_templates += self::$registered_templates;

        /**
         * Now update the cache, which is what the get_page_templates() uses.
         */
        wp_cache_set( $key, $page_templates, $group, 1800 );

        /**
         * We are using this hook as if it were an action.
         * So do not modify $title, just return it.
         */
        return $title;

    }

}
WPSE_196995_Page_Templates::on_load();

La clase proporciona el método register_page_template() , por supuesto, pero para agregar su plantilla de página, se actualiza el valor para 'page_templates' establecido en el caché de objetos.

Es un poco intrépido porque WordPress hizo la mayoría de los métodos y propiedades de WP_Theme class private , pero afortunadamente usaron el caché de objetos de WordPress accesible públicamente para almacenar los valores. Y al actualizar el caché de objetos en el gancho 'default_page_template_title' , que se llama justo antes de que se genere la lista desplegable de plantillas de página y se envíe al navegador, podemos hacer que WordPress muestre su (s) plantilla (s) de página como desee.

    
respondido por el MikeSchinkel 08.08.2015 - 18:33
1

Se corrió con un truco feo: - /. Voy a actualizar la respuesta si voy con jQuery más tarde. La solución aún requiere tener archivos de plantilla, pero el código para el archivo de plantilla se carga desde index.php

  1. Hice un nuevo directorio template/ y puse toda la plantilla de página allí.
  2. Todas las plantillas de página están en blanco. Solo lo necesitamos para que aparezcan en el menú desplegable.
  3. Utilice el filtro template_include para redirigir a index.php

Código

Ejemplo de plantilla de página en blanco

<?php
/*
Template Name: No Sidebar
 *
 * */

Filtro

add_filter( 'template_include', function ($template ) {

    if ( !is_page_template()  )
        return $template;

    return locate_template( array( 'index.php' ), true );

}, 99);

He creado un ticket de trac para permitir agregar plantillas a través del filtro.

    
respondido por el Sisir 08.08.2015 - 10:16

Lea otras preguntas en las etiquetas