Eigene Seitenvorlagen mit Plugins erstellen?

61

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

jnthnclrk
quelle

Antworten:

73

get_page_template()kann über den page_templateFilter ü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 (bearbeiten Sie sie im Admin-Bereich und speichern Sie sie in der Datenbank?), Möchten Sie sie möglicherweise in ein Cache-Verzeichnis schreiben und auf sie verweisen oder template_redirectverrückte eval()Dinge erledigen .

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;
}
Jan Fabry
quelle
Hey Jan, hast du einen Beispielcode, wie man eine Plugin-Datei als benutzerdefinierte Seitenvorlage übergibt?
Jnthnclrk
@trnsfrmr: Es ist ganz einfach, ich habe meiner Antwort ein einfaches Beispiel hinzugefügt.
Jan Fabry
10
Beachten Sie, dass dies in späteren Versionen (3.1+) mehr oder weniger durch den Filter "template_include" ersetzt wurde.
Inigoesdr
Perfekt !!!, du hast mir Zeit gespart @JanFabry
Kishan Chauhan
Wie von @fireydude angegeben, ist dies keine generische Lösung. Es ist eine Problemumgehung, die den Seitenblock hartcodiert.
Mauro Colella
22

Überschreiben 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',
        );
}
fireydude
quelle
Wäre schön ( und am liebsten ), wenn du den entsprechenden Code aus dem Link in deiner Antwort posten kannst, sonst ist das nichts weiter als ein aufgeblähter Kommentar :-)
Pieter Goosen
Das Tutorial nennt das Beispiel von Tom McFarlin als Urheber dieses Ansatzes.
Fireydude
7

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

Ein anderer Ansatz, der mir in den Sinn kommt, ist die Verwendung der WP-Dateisystem-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!

Ari
quelle
Das verlinkte Beispiel-Plugin ist sogar ziemlich gut dokumentiert. Ich mag es. :)
Arvid
0

Keine der vorherigen Antworten hat für mich funktioniert. Hier können Sie Ihre Vorlage in Wordpress Admin auswählen. Einfach in die Haupt-PHP-Plugin-Datei einfügen und template-configurator.phpdurch den Namen der Vorlage ändern

//Load template from specific page
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){

    if ( get_page_template_slug() == 'template-configurator.php' ) {
        $page_template = dirname( __FILE__ ) . '/template-configurator.php';
    }
    return $page_template;
}

/**
 * Add "Custom" template to page attirbute template section.
 */
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {

    // Add custom template named template-custom.php to select dropdown 
    $post_templates['template-configurator.php'] = __('Configurator');

    return $post_templates;
}
Dessauges Antoine
quelle