Ho cercato nelle ultime due ore un modo per creare un modello di pagina personalizzato all'interno di un plugin, ma non ho ancora avuto fortuna.
Quello che sto specificamente cercando di fare è aggiungere un'opzione all'elenco dei modelli di pagina disponibili durante la modifica di una pagina e non utilizzare altri metodi comeif( is_page( 'page-slug' ) ) { /* etc */ }
Esiste una variabile globale che posso modificare per farlo?
Modificare:
Attualmente sto usando questo codice, basato sul link @ m0r7if3r che mi ha dato in un commento, il problema è che eseguirà questa funzione quando si visualizza la pagina, ma non quando si modifica la pagina (per popolare l'elenco a discesa con i modelli di pagina) :
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;
}
}
Modifica 2:
Sembra che questa funzionalità verrà rilasciata in un futuro aggiornamento, ho letto alcuni ticket trac su questo e ci sono state alcune discussioni ma nessuna risposta reale (sperando in 3.4). Elencherà qui un po 'gli URL dei ticket trac.
Modifica 3:
Il codice sopra funziona, MA l'unico problema che sto avendo a questo punto è che non c'è nessun modello che viene aggiunto all'elenco a discesa durante la modifica / aggiunta di una nuova pagina. Sto provando alcune cose e aggiornerò presto la mia domanda.
page_template
hook, il codice sopra nella mia modifica è quello che viene attualmente utilizzato. Devo usare il template_redirect
gancio e quindi aggiungere il page_template
filtro?