2013-07-22 11 views
1

J'ai écrit un plugin pour wordpress. Le problème est que je dois ajouter manuellement le modèle personnalisé au dossier thématique approprié dans wp-content\themes\them_name puis connectez-vous au tableau de bord et définir le modèle de page. Ce n'est pas bien quand je désactive le module puisque je dois également désactiver le modèle personnalisé à partir du back-end.Comment ajouter un template custome avec l'installation du plugin wordpress

Existe-t-il un moyen de gérer cela à partir du code du plugin?

+0

vous pouvez créer shortcode dans le plugin et l'utiliser dans votre fichier thème ou partout – Vipul

+0

Je dois vérifier comment faire avec shotcode, mais une autre question est que je dois encore définir manuellement la page. Pouvez-vous expliquer plus ? – newday

Répondre

2

Voici ma solution de code pour ajouter des modèles de page à partir d'un plugin Wordpress (inspiré par Tom McFarlin).

Ceci est conçu pour un plugin (les fichiers modèles sont recherchés dans le répertoire racine du plugin). Ces fichiers sont également exactement au même format que s'ils devaient être inclus directement dans un thème. Cela peut être changé si vous le souhaitez - consultez mon tutoriel complet http://www.wpexplorer.com/wordpress-page-templates-plugin/ pour plus de détails sur cette solution.

Pour personnaliser, éditez simplement le bloc de code suivant dans la méthode __construct;

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

code complet;

class PageTemplater { 

    /** 
    * A Unique Identifier 
    */ 
    protected $plugin_slug; 

    /** 
    * A reference to an instance of this class. 
    */ 
    private static $instance; 

    /** 
    * The array of templates that this plugin tracks. 
    */ 
    protected $templates; 


    /** 
    * Returns an instance of this class. 
    */ 
    public static function get_instance() { 

      if(null == self::$instance) { 
        self::$instance = new PageTemplater(); 
      } 

      return self::$instance; 

    } 

    /** 
    * 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', 
      ); 

    } 


    /** 
    * Adds our template to the pages cache in order to trick WordPress 
    * into thinking the template file exists where it doens't really exist. 
    * 
    */ 

    public function register_project_templates($atts) { 

      // Create the key used for the themes cache 
      $cache_key = 'page_templates-' . md5(get_theme_root() . '/' . get_stylesheet()); 

      // Retrieve the cache list. 
      // If it doesn't exist, or it's empty prepare an array 
      $templates = wp_get_theme()->get_page_templates(); 
      if (empty($templates)) { 
        $templates = array(); 
      } 

      // New cache, therefore remove the old one 
      wp_cache_delete($cache_key , 'themes'); 

      // Now add our template to the list of templates by merging our templates 
      // with the existing templates array from the cache. 
      $templates = array_merge($templates, $this->templates); 

      // Add the modified cache to allow WordPress to pick it up for listing 
      // available templates 
      wp_cache_add($cache_key, $templates, 'themes', 1800); 

      return $atts; 

    } 

    /** 
    * Checks if the template is assigned to the page 
    */ 
    public function view_project_template($template) { 

      global $post; 

      if (!isset($this->templates[get_post_meta( 
       $post->ID, '_wp_page_template', true 
      )])) { 

        return $template; 

      } 

      $file = plugin_dir_path(__FILE__). get_post_meta( 
       $post->ID, '_wp_page_template', true 
      ); 

      // Just to be safe, we check if the file exist first 
      if(file_exists($file)) { 
        return $file; 
      } 
      else { echo $file; } 

      return $template; 

    } 


} 

add_action('plugins_loaded', array('PageTemplater', 'get_instance')); 

Vérifiez mon tutoriel sur ce pour plus d'informations.

http://www.wpexplorer.com/wordpress-page-templates-plugin/

J'espère que cela vous aide dans ce que vous voulez faire :)

+0

Malheureusement, à partir de WordPress 4.7, cette méthode ne fonctionne plus – anastymous

+0

Pour ceux qui recherchent une solution pour WordPress 4.7 - L'auteur a déjà fourni un correctif - https://github.com/wpexplorer/page-templater/blob/master/ pagetemplater.php – anastymous

Questions connexes