2011-01-10 10 views
28

Kann eine Datei im Plugin-Verzeichnis als benutzerdefinierte Seitenvorlage verwendet werden?WP - Datei im Plugin-Verzeichnis als benutzerdefinierte Seitenvorlage verwenden?

Auch, wie machst du ein Plugin, um eine Seite zu erstellen?

Ich entwickle ein Plugin für einen Client basierend auf einem Thema, er möchte, dass dieses Plugin Verkaufsseiten erstellt, während er sein Thema auf der Homepage verwenden kann. Dies ist ein Produkt, das ich für ihn auf den Markt gebracht habe, so dass es durch das Plugin automatisiert werden muss.

Ist das möglich?

EDIT

Ich habe die Aktivierung/Deaktivierung Haken in meinem Plugins Haupt-Datei, und es ist nicht arbeiten. Hier ist der Code:

$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); 
} 
+1

Sie müssen überprüfen, dass das aktive Themenverzeichnis beschreibbar ist, bevor Sie dort eine Datei erstellen können (denke ich). In Bezug auf ein Plugin liefern eine Seite Vorlage, ja, das kann sicherlich getan werden, müssen Sie auf "template_redirect" Haken und passen Sie den Pfad zu der Vorlage, die aufgerufen wird. Bitte denken Sie in Zukunft daran, Ihre WordPress-Fragen an ** wordpress.stackexchange.com ** zu schicken. – t31os

Antwort

45

Sie können dies mit dem template_redirect-Hook tun. Hier ist mein Code, um die Vorlage für einen benutzerdefinierten Beitragstyp durch eine im Theme manuell zu ersetzen, wenn es keine im Vorlagenordner gibt. Setze dies in deine Plugin-Datei und lege dann einen Ordner unter deinem Plugin namens themefiles mit deinen Standard-Theme-Dateien ab.

//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; 
    } 
} 
+0

Aber es wird nicht 'Kopfzeile', 'Fußzeile' enthalten. Recht ? – Jashwant

+1

Nicht, wenn Sie 'get_header();' und 'get_footer();' in die Vorlagendatei einfügen. – David

+0

Ja, das wird ein Problem im Theme machen, das 'Theme Wrapper' wie roots verwendet :(Irgendeine Idee über diese? – Jashwant

8

der Code David oben geschrieben funktioniert fast für mich. aber es scheint sich über alle Beiträge und Seiten für mich auszubreiten. Dieser Code unten funktioniert gut für eine Vorlage zu einem einzigen Beitrag Typ hinzufügen, die von meinem Haupt-Plugin-Datei erstellt wird

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

aber ich habe Probleme bekommen es mit einer benutzerdefinierten Seitenvorlagen zu arbeiten, die keine haben post_type oder hat eine post_type = Seite zum Beispiel sagen wir, die benutzerdefinierte Seite ist ein Hilfsmitglied Login-Seite, um meine benutzerdefinierten Beiträge zu sehen. In meinem Fall heißt diese Datei myaccount.php und ich habe sie in einen Unterordner in meinem Plugin-Ordner mit dem Namen themefiles aufgenommen.

//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; 
    } 
} 

, wenn ich den obigen Code zu tun zeigt die myaccount Vorlage auf allen Seiten nach oben, außer für zu Hause, die ich glaube, weil es auf eine Blogroll statt einer statischen Seite

9

Sie CAN gesetzt Seite hinzufügen Vorlagen aus einem Plugin sehr einfach durch Manipulation des Seitencaches.

Bearbeiten Sie zur Anpassung einfach den folgenden Codeblock innerhalb der __construct-Methode;

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

Dies ist für ein Plugin (die Vorlagedateien werden im Stammverzeichnis des Plugins gesucht) konzipiert. Dies kann bei Bedarf geändert werden - lesen Sie mein vollständiges Tutorial http://www.wpexplorer.com/wordpress-page-templates-plugin/ für weitere Details zu dieser Lösung. Diese Dateien haben genau das gleiche Format, als wenn sie direkt in ein Thema aufgenommen würden.

Vollständiger Code;

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

überprüfen Auf diese meine Tutorial für weitere Informationen.

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

Ich hoffe, das hilft Ihnen, was Sie tun wollen :)

+1

Wie würde man dies erweitern, um möglicherweise ein Array in _construct() zu übergeben? Als ob das eine Bibliotheksklasse wäre, die von mehreren Plugins benutzt wird.In meinem bisherigen Versuch erhalte ich die Templates (aus Array) im Dropdown, aber Bei jedem Speichern/Veröffentlichen wird der Wert gelöscht sauber :(Irgendwelche Gedanken dazu? – Xtremefaith

+0

Unvorsätzlich bricht dies nach WP 4.7 Update. Wenn ich das 'wp_cache_get ($ cache_key, 'themes') debugge;' Am Ende von 'register_project_templates()' Es zeigt den Wert, aber es wird nicht während der nächsten Iteration – Xtremefaith

+0

Es erscheint 'wp_get_theme() -> get_page_templates () 'benutzt den Cache nicht mehr. Selbst wenn ich positiv bin, hat der Cache das richtige Array (_nach einigen Anpassungen) _ das Drop-down zeigt immer noch nichts mehr an, als was ursprünglich vom 'get_page_templates()' Aufruf erhalten wurde – Xtremefaith

3

ich nicht user1912899 antworten kann, aber ihre Empfehlung scheint die eleganteste Lösung. Um eine einzelne Vorlage zu verwenden, um die single-post.php zu überschreiben, habe ich den folgenden Code implementiert. Dies funktioniert für jede benutzerdefinierte single - ****. Php Datei, die Sie Ihrem Plugin hinzufügen. Wenn es nicht existiert, greift es nur auf das zurück, was WordPress normalerweise verwendet.

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; 

} 
Verwandte Themen