Créer des modèles de page personnalisés avec des plugins?

61

Est-il possible de rendre des modèles de page personnalisés disponibles à partir d'un plugin?

Jnthnclrk
la source

Réponses:

73

get_page_template()peut être remplacé via le page_templatefiltre. Si votre plugin est un répertoire contenant les modèles en tant que fichiers, il vous suffit de passer les noms de ces fichiers. Si vous voulez les créer "à la volée" (les éditer dans la zone d'administration et les enregistrer dans la base de données?), Vous pouvez les écrire dans un répertoire de cache et y faire référence, ou y accrocher template_redirectet faire des eval()trucs fous .

Un exemple simple pour un plugin qui "redirige" vers un fichier du même répertoire de plugin si un critère donné est vrai:

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;
}
Jan Fabry
la source
Hey Jan, avez-vous un exemple de code sur la façon de passer un fichier de plugin en tant que modèle de page personnalisé?
Jnthnclrk
@trnsfrmr: C'est très simple, j'ai ajouté un exemple simple à ma réponse.
Jan Fabry
10
Notez que cela a été plus ou moins remplacé par le filtre "template_include" dans les versions ultérieures (3.1+).
Inigoesdr
Parfait !!!, vous avez économisé mon temps @JanFabry
Kishan Chauhan
Comme l'a déclaré @fireydude, ce n'est pas une solution générique. C'est une solution de contournement qui code en dur le slug de page.
Mauro Colella le
22

Passer outre get_page_template()est juste un hack rapide. Il ne permet pas de sélectionner le modèle à partir de l'écran Admin et le slug de page est codé en dur dans le plug-in, de sorte que l'utilisateur n'a aucun moyen de savoir d'où provient le modèle.

La solution à privilégier serait de suivre ce tutoriel qui vous permet d’enregistrer un modèle de page dans le back-end à partir du plug-in. Ensuite, cela fonctionne comme n'importe quel autre modèle.

 /*
 * 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',
        );
}
Fireydude
la source
Ce serait bien ( et préférable ) si vous pouviez poster le code correspondant à partir du lien dans votre réponse, sinon ce n'est rien de plus qu'un commentaire gonflé :-)
Pieter Goosen
Le tutoriel attribue en fait l'exemple de Tom McFarlin à l'origine de cette approche.
fireydude
7

Oui c'est possible. J'ai trouvé cet exemple de plugin très utile.

Une autre approche qui me vient à l’esprit consiste à utiliser l’ API WP Filesystem pour créer le fichier de modèle à thème. Je ne suis pas sûr que ce soit la meilleure approche à prendre, mais je suis sûr que cela fonctionne!

Ari
la source
L'exemple de plug-in lié est même assez bien documenté. J'aime ça. :)
Arvid
0

Aucune des réponses précédentes ne fonctionnait pour la mienne. En voici un où vous pouvez choisir votre modèle dans Wordpress admin. Il suffit de le mettre dans votre fichier plugin php principal et de le modifier template-configurator.phppar votre nom de modèle

//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;
}
Dessauges Antoine
la source