it-swarm.com.de

Wie kann ich der Liste der Seitenvorlagen eine Option aus einem Plugin hinzufügen?

Ich habe mich in den letzten Stunden nach einer Möglichkeit umgesehen, eine benutzerdefinierte Seitenvorlage aus einem Plugin heraus zu erstellen, hatte aber noch kein Glück.

Ich versuche speziell, der Liste der verfügbaren Seitenvorlagen eine Option hinzuzufügen, wenn ich eine Seite bearbeite, und nicht eine andere Methode wie if( is_page( 'page-slug' ) ) { /* etc */ } zu verwenden.

Gibt es eine globale Variable, die ich ändern kann, um dies zu tun?

Bearbeiten:

Ich verwende derzeit diesen Code, basierend auf dem Link @ m0r7if3r, den ich in einem Kommentar erhalten habe. Das Problem ist, dass diese Funktion beim Anzeigen der Seite ausgeführt wird, jedoch nicht beim Bearbeiten der Seite (um die Dropdown-Liste mit den Seitenvorlagen zu füllen). :

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

Edit 2:

Es scheint, dass diese Funktionalität in einem zukünftigen Update veröffentlicht wird. Ich habe einige Trac-Tickets darüber gelesen und es gab einige Diskussionen, aber keine wirkliche Antwort (in der Hoffnung auf 3.4). Hier werden in Kürze URLs für Trac-Tickets aufgelistet.

Edit 3:

Der obige Code funktioniert, ABER das einzige Problem, das ich derzeit habe, ist, dass beim Bearbeiten/Hinzufügen einer neuen Seite keine Vorlage zur Dropdown-Liste hinzugefügt wird. Ich versuche ein paar Dinge und werde meine Frage bald aktualisieren.

10
Jared

Filter? Jemand?

Es gibt einen no -Filter, der hilft: page_template_dropdown($template); wird zum Erstellen des Dropdowns verwendet und kann nicht gefiltert werden.

Schleichen Sie sich in das Templates-Array ein?

Um die Dropdown-Inhalte zu erstellen, verwendet die Kern-Meta-Box get_page_templates(). Von innen sieht die Funktion folgendermaßen aus:

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

Aber wenn Sie sich mit get_themes(); befassen, gibt es keine Möglichkeit, die Liste der Vorlagen abzufangen. Außerdem haben wir das Problem, dass es keine Möglichkeit gibt, eine Vorlage von außerhalb des Themes-Verzeichnisses zu erhalten ...

... ein Thema vortäuschen!

Die Theorie und ihre Nachteile…

Sie können register_theme_directory() verwenden, um ein zusätzliches Themenverzeichnis hinzuzufügen, in dem Sie Vorlagen platzieren können. Am einfachsten ist es also, Ihr Plugin auch als Themenordner zu registrieren:

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

Hinweis: Hier bin ich mir nicht sicher, ob es funktionieren wird.

Während der Aktivierung des Plugins: Dann solltest du eine style.css.php Datei in deinen templates Ordner legen. Auf diese Weise können Sie Ihrer Datei Variablen hinzufügen. Diese Variable wäre dann das übergeordnete Thema. Und das übergeordnete Thema sollte einfach das aktuell aktive Thema sein. Dann aktualisiere dein aktives Theme auf dein Plugin.

Nachteil Nr. 2: Über die Benutzeroberfläche "Darstellung"… Fügen Sie möglicherweise eine Anmerkung hinzu, dass dieses "Thema" nicht als eigentliches Thema verwendet werden soll. Ich überlasse den Rest des "Vermeide es, dieses Thema zu aktivieren" -Stoffs deiner Fantasie. Wie auch immer: Es sollte funktionieren.

Nachteil Nr. 2: Mit diesem Trick werden untergeordnete Themen erfolgreich vermieden. Sie dürfen ein übergeordnetes Thema haben. Nichts mehr.

4
kaiser

Haben Sie in Erwägung gezogen, als Vorschlag für eine mögliche Problemumgehung das WordPress-Dateisystem zu verwenden, um eine Seitenvorlagendatei von Ihrem Plug-in in Ihr aktuelles Active Theme-Verzeichnis zu schreiben? Abhängig davon, wie viel Kontrolle Sie über diesen Prozess haben möchten, können Sie die Datei bei der Aktivierung von Ihrem Plugin schreiben lassen und sie bei der Deinstallation entfernen. Alternativ können Sie Seitenvorlagendateien dynamisch über die Plug-in-Benutzeroberfläche erstellen und dabei ein Formular verwenden, um bestimmte Werte zu übergeben, z. B. den Namen der Seitenvorlage, der im Dropdown-Feld des Post-Edit-Bildschirms angezeigt werden soll. Theoretisch können Sie die Seitenvorlage auch auf Knopfdruck aus Ihrer Plugin-Benutzeroberfläche entfernen und auf ähnliche Weise mehrere Vorlagen für verschiedene Zwecke hinzufügen. Es gibt einen guten Beitrag über die Verwendung des Dateisystems in Ottos Blog. Ich habe den Link jetzt nicht bei mir, aber Sie können danach suchen.

Ich hoffe, sie veröffentlichen das, was Sie vorhatten, in der nächsten Hauptversion.

2
userabuser

Ich habe dies in der Vergangenheit erreicht, indem ich die Metabox der Standardseitenvorlage entfernt und dann Ihre eigene Metabox hinzugefügt habe. Ich ließ die neue Metabox die eingebauten get_page_templates verwenden und fügte dann die anderen hinzu, die ich programmatisch brauchte. Beim Speichern kann die Seitenvorlage wie in WordPress aktualisiert werden.

1
gruvii

Schauen Sie sich den Hook theme_page_templates an, der von der Funktion get_page_templates verwendet wird. Dieser Filter wurde seit der Aktualisierung von 3.9 in 4.4 hinzugefügt:

apply_filters( 'theme_page_templates', $page_templates, $this, $post );
1
William Gu

Ich habe einen Blick in die Quelle geworfen, und es sieht ziemlich schockierend aus, als gäbe es keinen Weg, dies zu tun! Mein Vorschlag für einen Hack wäre, eine zweite Meta-Box mit einem Theme Override/Second Theme Dropdown hinzuzufügen. Dann haken Sie in diesen Filter ein:

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

um deine Themendatei zurückzugeben, wenn sie überschrieben wurde. Natürlich möchten Sie nur add_filter verwenden, wenn es sich um den gewünschten Beitrag handelt.

Wenn Sie Lust haben, können Sie die Originalverpackung verschrotten und neu erstellen (natürlich über Filter, ohne den Kerncode zu ändern).

Ich würde auch vorschlagen, ein Trac-Ticket hinzuzufügen, um diese Funktionalität anzufordern (falls noch keines vorhanden ist).

1
Matthew Boynes