web-dev-qa-db-de.com

Eigene Seitenvorlagen mit Plugins erstellen?

Ist es möglich, benutzerdefinierte Seitenvorlagen über ein Plugin verfügbar zu machen?

52
jnthnclrk

get_page_template() kann über den page_template-Filter überschrieben werden. Wenn Ihr Plugin ein Verzeichnis mit den Vorlagen als Dateien ist, müssen Sie nur die Namen dieser Dateien übergeben. Wenn Sie sie "on the fly" erstellen möchten (im Admin-Bereich bearbeiten und in der Datenbank speichern?), Können Sie sie in ein Cache-Verzeichnis schreiben und auf sie verweisen oder sich in template_redirect einhängen. und mach ein paar verrückte eval() Sachen.

Ein einfaches Beispiel für ein Plugin, das zu einer Datei im selben Plugin-Verzeichnis "umleitet", wenn ein bestimmtes Kriterium erfüllt ist:

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

Das Überschreiben von get_page_template() ist nur ein schneller Hack. Die Vorlage kann nicht auf dem Admin-Bildschirm ausgewählt werden, und der Page Slug ist fest in das Plug-In integriert, sodass der Benutzer nicht weiß, woher die Vorlage stammt.

Die bevorzugte Lösung wäre, diesem Tutorial zu folgen mit dem Sie eine Seitenvorlage im Back-End des Plug-Ins registrieren können. Dann funktioniert es wie jede andere Vorlage.

 /*
 * 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

Ja, es ist möglich. Ich fand dieses Beispiel-Plugin sehr hilfreich.

Ein anderer Ansatz, der mir in den Sinn kommt, ist die Verwendung von WP Filesystem API , um die Vorlagendatei für das Thema zu erstellen. Ich bin mir nicht sicher, ob es der beste Ansatz ist, aber ich bin mir sicher, dass es funktioniert!

5
KeepMove