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.