Creare modelli di pagina personalizzati con plugin?


Risposte:


73

get_page_template()può essere ignorato tramite il page_templatefiltro. Se il tuo plug-in è una directory con i modelli come file, è solo questione di 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 della cache e fare riferimento ad essi, oppure agganciarli template_redirecte fare eval()cose folli .

Un semplice esempio per un plugin che "reindirizza" a un file nella stessa directory del plugin se un certo 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 plugin come modello di pagina personalizzato?
jnthnclrk,

@trnsfrmr: è davvero facile, ho aggiunto un semplice esempio alla mia risposta.
Jan Fabry,

10
Si noti che questo è stato più o meno sostituito dal filtro "template_include" nelle versioni successive (3.1+).
Inigoesdr,

Perfetto !!!, mi hai fatto risparmiare il tempo @JanFabry
Kishan Chauhan il

Come affermato da @fireydude, questa non è una soluzione generica. È una soluzione alternativa che codifica in modo rigido la lumaca di pagina.
Mauro Colella,

22

L'override get_page_template()è solo un trucco rapido. Non consente di selezionare il modello dalla schermata di amministrazione e lo slug della pagina è codificato nel plug-in in modo che l'utente non abbia modo di sapere da dove provenga il modello.

La soluzione preferita sarebbe seguire questo tutorial che consente di registrare un modello di pagina nel back-end dal plug-in. Quindi funziona come qualsiasi altro modello.

 /*
 * Initializes the plugin by setting filters and administration functions.
 */
private function __construct() {
        $this->templates = array();

        // Add a filter to the attributes metabox to inject template into the cache.
        add_filter('page_attributes_dropdown_pages_args',
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the save post to inject out template into the page cache
        add_filter('wp_insert_post_data', 
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the template include to determine if the page has our 
        // template assigned and return it's path
        add_filter('template_include', 
            array( $this, 'view_project_template') 
        );

        // Add your templates to this array.
        $this->templates = array(
                'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
        );
}

Sarebbe bello ( e preferito ) se puoi inserire il codice pertinente dal link nella tua risposta, altrimenti questo non è altro che un commento gonfio :-)
Pieter Goosen

Il tutorial in realtà attribuisce l'esempio di Tom McFarlin come il creatore di questo approccio.
fireydude,

7

Sì, è possibile. Ho trovato questo plugin di esempio molto utile.

Un altro approccio che mi viene in mente è l'utilizzo dell'API WP Filesystem per creare il file modello sul tema. Non sono sicuro che sia l'approccio migliore da adottare, ma sono sicuro che funzioni!


Il plug-in di esempio collegato è persino abbastanza ben documentato. Mi piace. :)
Arvid

0

Nessuna delle risposte precedenti funzionava per la mia. Qui uno in cui puoi scegliere il tuo modello nell'amministratore di Wordpress. Basta inserirlo nel file del plug-in php principale e modificarlo in template-configurator.phpbase al nome del modello

//Load template from specific page
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;
}

/**
 * Add "Custom" template to page attirbute template section.
 */
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 ) {

    // Add custom template named template-custom.php to select dropdown 
    $post_templates['template-configurator.php'] = __('Configurator');

    return $post_templates;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.