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.