Creare template di pagina personalizzati con i plugin?
È possibile rendere disponibili i template di pagina personalizzati da un plugin?

get_page_template()
può essere sovrascritto tramite il filtro page_template
. Se il tuo plugin è una directory con i template come file al suo interno, è sufficiente passare i nomi di questi file. Se vuoi crearli "al volo" (modificarli nell'area di amministrazione e salvarli nel database?), potresti volerli scrivere in una directory di cache e fare riferimento a quelli, oppure agganciarti a template_redirect
e fare qualche magia con eval()
.
Un semplice esempio per un plugin che "reindirizza" a un file nella stessa directory del plugin se un determinato criterio è vero:
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
if ( is_page( 'my-custom-page-slug' ) ) {
$page_template = dirname( __FILE__ ) . '/custom-page-template.php';
}
return $page_template;
}

Ehi Jan, hai qualche esempio di codice su come passare un file di plugin come template di pagina personalizzato?

@trnsfrmr: È davvero semplice, ho aggiunto un esempio alla mia risposta.

Nota che questa funzionalità è stata più o meno sostituita dal filtro "template_include" nelle versioni successive (3.1+).

Sovrascrivere get_page_template()
è solo una soluzione rapida e approssimativa. Non consente di selezionare il template dalla schermata di Amministrazione e lo slug della pagina è hard-codato nel plugin, quindi l'utente non ha modo di sapere da dove proviene il template.
La soluzione preferita sarebbe seguire questo tutorial che permette di registrare un template di pagina nel back-end direttamente dal plugin. In questo modo funzionerà come qualsiasi altro template.
/*
* Inizializza il plugin impostando i filtri e le funzioni di amministrazione.
*/
private function __construct() {
$this->templates = array();
// Aggiunge un filtro al metabox degli attributi per inserire il template nella cache
add_filter('page_attributes_dropdown_pages_args',
array( $this, 'register_project_templates' )
);
// Aggiunge un filtro al salvataggio del post per inserire il nostro template nella cache della pagina
add_filter('wp_insert_post_data',
array( $this, 'register_project_templates' )
);
// Aggiunge un filtro all'inclusione del template per determinare se la pagina ha il nostro
// template assegnato e restituirne il percorso
add_filter('template_include',
array( $this, 'view_project_template')
);
// Aggiungi i tuoi template a questo array.
$this->templates = array(
'goodtobebad-template.php' => 'È Bello Essere Cattivi',
);
}

Sarebbe bello (e preferibile) se potessi pubblicare il codice rilevante dal link nella tua risposta, altrimenti questo non è altro che un commento gonfiato :-)

Il tutorial in realtà attribuisce l'esempio di Tom McFarlin come l'origine di questo approccio.

Nessuna delle risposte precedenti ha funzionato per me. Ecco una soluzione che permette di scegliere il template nell'amministrazione di WordPress. Basta inserirla nel file PHP principale del tuo plugin e modificare template-configurator.php
con il nome del tuo template
//Carica il template da una pagina specifica
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){
if ( get_page_template_slug() == 'template-configurator.php' ) {
$page_template = dirname( __FILE__ ) . '/template-configurator.php';
}
return $page_template;
}
/**
* Aggiunge il template "Personalizzato" alla sezione degli attributi della pagina.
*/
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {
// Aggiunge il template personalizzato chiamato template-custom.php al menu a discesa di selezione
$post_templates['template-configurator.php'] = __('Configuratore');
return $post_templates;
}

Sì, è possibile. Ho trovato questo plugin di esempio molto utile.
Un altro approccio che mi è venuto in mente è utilizzare l'API WP Filesystem per creare il file template nel tema. Non sono sicuro che sia l'approccio migliore da adottare, ma sono certo che funzioni!
