Creare template di pagina personalizzati con i plugin?

28 ott 2010, 20:04:20
Visualizzazioni: 122K
Voti: 84

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

0
Tutte le risposte alla domanda 4
5
92

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;
}
2 nov 2010 15:52:24
Commenti

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

jnthnclrk jnthnclrk
16 nov 2010 19:58:46

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

Jan Fabry Jan Fabry
16 nov 2010 21:46:14

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

Daniel R Daniel R
10 giu 2013 18:54:10

Perfetto !!!, mi hai fatto risparmiare tempo @JanFabry

Kishan Chauhan Kishan Chauhan
21 dic 2018 16:02:14

Come affermato da @fireydude, questa non è una soluzione generica. È un workaround che codifica in modo fisso lo slug della pagina.

Mauro Colella Mauro Colella
8 lug 2019 00:18:25
2
31

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',
        );
}
12 ott 2015 14:29:34
Commenti

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

Pieter Goosen Pieter Goosen
12 ott 2015 14:32:32

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

fireydude fireydude
12 ott 2015 14:53:34
1
16

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;
}
22 ott 2019 11:21:25
Commenti

Questo è il modo giusto per farlo.

Muhammad Zohaib Muhammad Zohaib
26 ago 2023 11:52:32
1

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!

4 dic 2014 17:37:08
Commenti

Il plugin di esempio linkato è anche ben documentato. Mi piace. :)

Arvid Arvid
14 ago 2017 17:46:58