Gibt es ein WordPress-Plugin, das eine Plugin-Datei als benutzerdefinierte Seitenvorlage registriert?

9

Ich muss ein Plugin erstellen, das benutzerdefinierte Seitenvorlagen in wp-admin verfügbar macht. Ich frage mich, ob jemand dies bereits in Angriff genommen hat, da es ein ziemlich typischer Prozess zu sein scheint.

jnthnclrk
quelle
Ich verstehe die Frage nicht ganz. Sie möchten ein Plugin, das benutzerdefinierte Vorlagen einfügt, die im Plugin definiert sind?
Steven

Antworten:

7

Wie Rarst geantwortet hat, können Sie dies wirklich tun, ohne die Kerndateien zu bearbeiten oder die Metabox für Seitenattribute zu entfernen und Ihre On mit demselben Code zu erstellen, mit ein wenig Modifikation. Der folgende Code ist der Code für die Datei /admin/include/meta-boxes.php, und ich habe einen Kommentar hinzugefügt, um zu zeigen, wohin Ihre zusätzlichen Seitenvorlagenoptionen führen würden:

function page_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => $post->post_type, 'exclude_tree' => $post->ID, 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
        ?>
        <p><strong><?php _e('Parent') ?></strong></p>
        <label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>
        <?php echo $pages; ?>
        <?php
        } // end empty pages check
    } // end hierarchical check.
    if ( 'page' == $post->post_type && 0 != count( get_page_templates() ) ) {
        $template = !empty($post->page_template) ? $post->page_template : false;
        ?>
        <p><strong><?php _e('Template') ?></strong></p>
        <label class="screen-reader-text" for="page_template"><?php _e('Page Template') ?></label><select name="page_template" id="page_template">
        <option value='default'><?php _e('Default Template'); ?></option>
        <?php page_template_dropdown($template); ?>

        // add your page templates as options

        </select>
        <?php
    } ?>
    <p><strong><?php _e('Order') ?></strong></p>
    <p><label class="screen-reader-text" for="menu_order"><?php _e('Order') ?></label><input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo esc_attr($post->menu_order) ?>" /></p>
    <p><?php if ( 'page' == $post->post_type ) _e( 'Need help? Use the Help tab in the upper right of your screen.' ); ?></p>
    <?php
}

Ich weiß nicht, ob dies ein Fix in Ihrem Fall ist, aber ich hatte einen Smiler-Fall, als ich den Beitragstyp in einem eingebauten Plugin-Thema anzeigen musste, und dafür habe ich verwendet add_filter('the_content', 'my-function'); und meine Funktion hat die Ausgabe zum Anzeigen erstellt.

Eine andere Möglichkeit wäre, Ihr Plugin dazu zu bringen, die Vorlagendatei im aktuellen Themenverzeichnis zu erstellen.

function create_plugins_theme_file(){
    $file_name = TEMPLATEPATH . '/' . $tamplate_name . '.php';
    $handle = fopen($file_name, 'w') or wp_die('Cannot open file for editing');
    $file_contents = <<<OUT
<?php
/*
Template Name: $tamplate_name
*/
?>

//you theme file here

OUT;

   fwrite($handle, $file_contents);
   fclose($handle);
 }

und Sie können dies ausführen, nachdem Sie zum ersten Mal überprüft haben, ob die Datei vorhanden ist

if(!file_exists( $file_name)){create_plugins_theme_file();}

Hoffe, eines davon hilft.

Bainternet
quelle
Testet Meta-Box-Sachen, Bus gemäß meiner Antwort - es ist nur ein Teil des Problems, andere ist - Code, der versucht, eine Vorlage nur zu laden, wenn sie sich im Themenverzeichnis befindet. Die Bereitstellung einer "externen" Vorlagendatei reicht daher möglicherweise nicht aus, um sie zu laden.
Erst
Aus diesem Grund habe ich vorgeschlagen, dass das Plugin die Dateien im Verzeichnis des Themas erstellt.
Bainternet
2

Ich bin mir nicht ganz sicher, ob ich verstehe, was Sie erreichen wollen, zumindest warum Sie möchten, dass ein Plugin dies tut.

Das normale Verfahren zum Erstellen verschiedener Seitenvorlagen lautet:

  1. Erstellen Sie eine neue Seitenvorlage in Ihrem ACTIVE-Themenverzeichnis (erstellen Sie eine Kopie von page.php).

  2. Ändern Sie den Namen der Vorlage (innerhalb der Datei).

    / * Vorlagenname: Seite mit voller Breite * /

  3. Ändern Sie den Code der Seite in das, was Sie erreichen möchten.

  4. Sie können jetzt eine neue Seite erstellen und auswählen, welche "Vorlage" verwendet werden soll.

Alt-Text

...

Ich hoffe, das ist es, was Sie erreichen wollen?

Offizielle Dokumentation hier: http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates

Lars Koudal
quelle
Woops. Beispiel PHP-Code ist ein bisschen durcheinander. Besuchen Sie den Link für das richtige Codebeispiel.
Lars Koudal
2
Interessiert zu wissen, ob jemand Jan's Methode in einem vorhandenen Plugin verwendet: wordpress.stackexchange.com/questions/3396/…
jnthnclrk
Ich glaube, @trnsfrmr sucht nach einer Möglichkeit, eine vordefinierte Seitenvorlage (Schritte 1-3) in seinem eigenen Plugin zu erstellen, um diese Vorlage für Benutzer nach der Plugin-Aktivierung verfügbar zu machen. Ich nehme an, er möchte dieses Lösungsthema unabhängig halten.
Michal Mau
Ah, okay, ich habe dort ein bisschen falsch verstanden, danke für die Klarstellung :-)
Lars Koudal
2

Dies scheint ziemlich schwer zu erreichen zu sein. get_page_templates()function verwirft aktiv alles, was sich nicht in übergeordneten und untergeordneten Stammverzeichnissen befindet. Es wird auch nicht in globalen Variablen gespeichert oder ermöglicht das Filtern der generierten Liste von Vorlagen.

Ich denke, dass die Meta-Box für Seitenattribute gegabelt und vollständig ersetzt werden muss. Und nicht sicher, ob es auch dann möglich sein wird.

Ich bin damit einverstanden, dass dies sinnvoll erscheint, aber WordPress-Code ist sehr präzise, ​​da benannte Vorlagen nur aus dem Verzeichnis des Themas stammen sollen.

Selten
quelle
1

Ist dies nicht einer der Gründe, register_theme_directory()die eingeführt wurden?

http://core.trac.wordpress.org/ticket/10467

Zu der Zeit war es ein Problem im Zusammenhang mit BuddyPress, das hier und da zusätzliche Vorlagen einwerfen wollte.

Ich gehe davon aus, dass sie nicht richtig als Seitenvorlagen aufgeführt sind:

http://core.trac.wordpress.org/ticket/15803

Denis de Bernardy
quelle
Ich werde den Code durchgehen (wahrscheinlich morgen), aber soweit ich mich erinnere, werden Vorlagen mit Namen explizit nur über Pfadkonstanten nachgeschlagen.
Erster