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 específicamente de hacer es agregar una opción a la lista de plantillas de página disponibles al editar una página, y no usar otro método comoif( is_page( 'page-slug' ) ) { /* etc */ }
¿Hay 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 las 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í bastantes tickets de seguimiento sobre esto y ha habido algunas discusiones pero no hubo una respuesta real (esperando 3.4). Enumerará aquí las URL de tickets de seguimiento 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.
page_template
gancho, el código anterior en mi edición es lo que se está utilizando actualmente. ¿Necesito usar el template_redirect
gancho y luego agregar el page_template
filtro allí?