WP – Usa il file nella directory dei plugin come modello di pagina personalizzato?

È ansible utilizzare un file nella directory dei plug-in come modello di pagina personalizzato?

Inoltre, come si crea un plugin per creare una pagina?

Sto sviluppando un plug-in per un client basato su un tema, vuole che questo plugin faccia le pagine di vendita pur essendo in grado di utilizzare il suo tema sulla home page. Questo è un prodotto che sto facendo per lui sul mercato, quindi deve essere automatizzato attraverso il plugin.

È ansible?

MODIFICARE

Ho i ganci di triggerszione / distriggerszione nel mio file principale dei plug-in e non funziona . Ecco il codice:

$filename = __FILE__; register_activation_hook($filename, 'superActivation'); register_deactivation_hook($filename, 'superDeactivation'); global $myFile; global $fh; global $stringData; global $filename; $myFile = "testFile.txt"; $stringData = "Testing\n"; $fh = fopen($myFile, 'w') or die("can't open file"); function superActivation() { global $myFile; global $fh; global $stringData; global $filename; fwrite($fh, $stringData); fclose($fh); } function superDeactivation() { $myFile = "testFile.txt"; unlink($myFile); } 

Puoi farlo con il hook template_redirect. Ecco il mio codice per sostituire manualmente il modello per un tipo di post personalizzato con uno nel tema se non ce n’è uno nella cartella dei modelli. Metti questo nel tuo file plugin e poi metti una cartella sotto il tuo plugin chiamata themefiles con i tuoi file di temi predefiniti.

 //Template fallback add_action("template_redirect", 'my_theme_redirect'); function my_theme_redirect() { global $wp; $plugindir = dirname( __FILE__ ); //A Specific Custom Post Type if ($wp->query_vars["post_type"] == 'product') { $templatefilename = 'single-product.php'; if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) { $return_template = TEMPLATEPATH . '/' . $templatefilename; } else { $return_template = $plugindir . '/themefiles/' . $templatefilename; } do_theme_redirect($return_template); //A Custom Taxonomy Page } elseif ($wp->query_vars["taxonomy"] == 'product_categories') { $templatefilename = 'taxonomy-product_categories.php'; if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) { $return_template = TEMPLATEPATH . '/' . $templatefilename; } else { $return_template = $plugindir . '/themefiles/' . $templatefilename; } do_theme_redirect($return_template); //A Simple Page } elseif ($wp->query_vars["pagename"] == 'somepagename') { $templatefilename = 'page-somepagename.php'; if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) { $return_template = TEMPLATEPATH . '/' . $templatefilename; } else { $return_template = $plugindir . '/themefiles/' . $templatefilename; } do_theme_redirect($return_template); } } function do_theme_redirect($url) { global $post, $wp_query; if (have_posts()) { include($url); die(); } else { $wp_query->is_404 = true; } } 

È ansible aggiungere modelli di pagina da un plugin molto facilmente manipolando la cache della pagina.

Per personalizzare, è sufficiente modificare il seguente blocco di codice all’interno del metodo __construct;

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

Questo è progettato per un plugin (i file del modello sono cercati nella directory principale del plugin). Questo può essere cambiato se lo si desidera – controlla il mio tutorial completo http://www.wpexplorer.com/wordpress-page-templates-plugin/ per maggiori dettagli su questa soluzione. Questi file sono anche nello stesso formato come se dovessero essere inclusi direttamente in un tema.

Codice completo;

 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' ) ); 

Guarda il mio tutorial su questo per maggiori informazioni.

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

Spero che questo ti aiuti in quello che vuoi fare 🙂

il codice david pubblicato qui sopra funziona quasi per me. ma sembra coprire tutti i post e le pagine per me. Questo codice qui sotto funziona alla grande per aggiungere un modello a un singolo tipo di post creato dal mio file plugin principale

 function get_book_post_type_template($single_template) { global $post; if ($post->post_type == 'books') { $single_template = dirname( __FILE__ ) . '/themefiles/single-books.php'; } return $single_template; } add_filter( "single_template", "get_book_post_type_template" ) ; 

ma ho difficoltà a farlo funzionare con un modello di pagina personalizzato che non ha un post_type o ha una pagina post_type = per esempio, diciamo che la pagina personalizzata è una pagina di login per i membri ausiliari per vedere i miei post personalizzati. nel mio caso questo file si chiama myaccount.php e l’ho incluso in una sottocartella all’interno della mia cartella di plugin denominata themefiles.

 //Add Page and Post Template Files to Current Theme add_action("template_redirect", 'my_account_redirect'); function my_account_redirect() { global $wp; //Set myAccount Custom Page Template if (isset($wp->query_vars['pagename'] ) == "myaccount") { $templatefilename = 'myAccount.php'; if (file_exists(dirname( __FILE__ ) . '/themefiles/' . $templatefilename)) { $return_template = dirname( __FILE__ ) . '/themefiles/' . $templatefilename; } do_account_redirect($return_template); } } //Finishing setting templates function do_account_redirect($url) { global $post, $wp_query; if (have_posts()) { include($url); die(); } else { $wp_query->is_404 = true; } } 

quando faccio il codice di cui sopra il modello myaccount appare su tutte le pagine ad eccezione di casa che credo sia perché è impostato su un blogroll invece di una pagina statica

Non posso rispondere all’utente 1912899, ma la loro raccomandazione sembra essere la soluzione più elegante. Per utilizzare un modello personalizzato per sovrascrivere single-post.php, ho implementato il seguente codice. Questo funzionerà con qualsiasi file singolo personalizzato *****. Php che aggiungi al tuo plugin. Se non esiste, ricade semplicemente su ciò che normalmente usa WordPress.

 add_action('template_include', 'my_template_include'); function my_template_include($template) { $file = dirname( __FILE__ ).'/theme/single-'.get_post_type().'.php'; if(file_exists($file)) { $template = $file; } return $template; }