web-dev-qa-db-fra.com

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

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

52
jnthnclrk

get_page_template() peut être remplacé via le filtre page_template. 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 cache et y faire référence, ou vous connecter au répertoire template_redirect et faire des trucs fous eval().

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;
}
70
Jan Fabry

Remplacer get_page_template() est juste un rapide bidouillage. 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 recommandée 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',
        );
}
15
fireydude

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

Une autre approche qui me vient à l’esprit consiste à utiliser WP API de système de fichiers 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!

5
KeepMove