it-swarm.com.de

Fügen Sie programmgesteuert benutzerdefinierte Vorlagenseiten hinzu

Ich versuche, eine Vorlagenseite aus einem Plugin hinzuzufügen, und meine Vorlagenseite befindet sich in diesem Plugin-Ordner. Ist dies möglich? Hier ist mein Code:

 global $user_ID;
    $new_post = array(
        'post_title' => 'Test Template Page',
        'post_content' => 'Some text',
        'post_status' => 'publish',
        'post_date' => date('Y-m-d H:i:s'),
        'post_author' => $user_ID,
        'post_type' => 'page',
        'post_category' => array(0)
    );
    $post_id = wp_insert_post($new_post);
    if (!$post_id) {
        wp_die('Error creating template page');
    } else {
        update_post_meta($post_id, '_wp_page_template', 'tp-file.php');
    }

tp-file.php ist meine benutzerdefinierte Vorlagenseite. Wenn ich diese Datei in den Ordner my-theme lege, funktioniert dies einwandfrei, aber ich möchte dies mit Dateien aus dem Plugin-Ordner tun, damit ich Benutzer nicht zwingen muss, diese zu kopieren Datei vom Plugin-Ordner zum Vorlagenordner. Ist das möglich? Irgendeine Idee?

6
user1147

Der Artikel verlinkt ist auf dem richtigen Weg, aber ich werde es einfacher für Sie machen ..;)

add_filter( 'page_template', 'catch_plugin_template' );

function catch_plugin_template( $template ) {
    if( 'tp-file.php' == basename( $template ) )
        $template = WP_PLUGIN_DIR . '/yourpluginname/tp-file.php';
    return $template;
}

Der Filter prüft grundsätzlich, ob Ihre spezielle Seitenvorlage für die aktuelle Seite festgelegt ist. Wenn dies der Fall ist, wird der Pfad so aktualisiert, dass er stattdessen auf Ihre Plugins-Vorlage verweist.

Vergewissern Sie sich nur, dass der Pfad richtig ist, da sonst Include-Fehler angezeigt werden ... :)

Follow-up Nr. 1

Ok erstes Problem ist, dass WordPress alle Vorlagen als Seitenvorlage validiert, dh. Es prüft, ob sich die Datei im Theme-Ordner befindet und ob es sich um eine gültige Vorlagendatei handelt. Andernfalls wird sie übersprungen und enthält eine allgemeinere Vorlage wie page.php.

Dies ändert jedoch nichts an der Tatsache, dass das Meta-Feld weiterhin den Wert Ihrer benutzerdefinierten Vorlage enthält, und auch is_page_template( 'tp-file.php' ) gibt den Wert true zurück, wenn es anstelle meiner vorherigen bedingten Anweisung verwendet wird, z.

// Filter page template
add_filter('page_template', 'catch_plugin_template');

// Page template filter callback
function catch_plugin_template($template) {
    // If tp-file.php is the set template
    if( is_page_template('tp-file.php') )
        // Update path(must be path, use WP_PLUGIN_DIR and not WP_PLUGIN_URL) 
        $template = WP_PLUGIN_DIR . '/tp-test/tp-file.php';
    // Return
    return $template;
}

HINWEIS: Ich habe den Code auf WP_PLUGIN_DIR umgestellt, da die WP_PLUGIN_URL-Konstante nicht für Pfade ... geeignet ist (enthält muss einen Pfad, keine URL verwenden).

Ein Problem, das Sie wirklich nicht beheben können, besteht darin, dass beim Anzeigen der Seite im Administrationsbereich beim Bearbeiten der Seite die Vorlage nicht als aktive Vorlage aufgeführt wird und das Speichern von Änderungen natürlich die ändern kann aktive Vorlage. Dort können wir viel tun. Das Dropdown-Menü für Seitenvorlagen wird von einer Funktion generiert, die Themendateien durchsucht. Es gibt keine Haken, die es uns ermöglichen würden, die Liste mit Plugin-Vorlagen zu erweitern.

Persönlich würde ich vorschlagen , um das Problem zu umgehen, ein zusätzliches Metafeld mit jeder Seite speichern, die mit Ihrer speziellen Pluginseite erstellt wurde, dann einen Haken an save_post oder wp_insert_post_data anfügen und prüfen, ob dieses Meta vorhanden ist Das Feld ist vorhanden. Ist dies der Fall, überprüfen Sie, ob die Seitenvorlage auf tp-file.php eingestellt ist. Ist dies nicht der Fall, aktualisieren Sie sie auf tp-file.php. Das zusätzliche Meta-Feld wäre sozusagen nur eine Flagge, um anzugeben, auf welchen Seiten Ihre Plugin-Vorlage angehängt werden muss.

Hier ist dein Plugin in seiner einfachsten Form (ja, ich habe es getestet) ... :)

<?php
/*
  Plugin Name: TP Test Plugin
  Plugin URI: 
  Description: TP Test Plugin
  Version: 1.0.0
  Author: 
  Author URI: 
*/

global $wp_version;

if( version_compare( $wp_version, "2.9", "<" ) )
    exit( 'This plugin requires WordPress 2.9 or newer. <a href="http://codex.wordpress.org/Upgrading_WordPress">Please update!</a>' );

// Add callback to admin menu
add_action('admin_menu', 'create_tp_menu');

// Callback to add menu items
function create_tp_menu() {
    add_management_page('TP Test', 'TP Test', 'manage_options', 'tp-teste', 'wp_tp_test_fnc' );
}

function wp_tp_test_fnc() {

    //include('tp-form-file.php');

    if( !empty( $_POST['tp_name'] ) ) {
        $tp_name = $_POST['tp_name'];

        global $user_ID;
        $new_post = array(
            'post_title' => $tp_name,
            'post_content' => 'Some text',
            'post_status' => 'publish',
            'post_date' => date('Y-m-d H:i:s'),
            'post_author' => $user_ID,
            'post_type' => 'page',
        );
        $post_id = wp_insert_post($new_post);

        if( !$post_id )
            wp_die('Error creating template page');
        else
            update_post_meta( $post_id, '_wp_page_template', 'tp-file.php' );
        /*
        $pt = get_page_templates();

        $pt['TP file test'] = WP_PLUGIN_URL . '/tp-test/tp-file.php';

        echo "<pre>";
        print_r($pt);
        echo "</pre>";
        */
    }   
    ?>
    <fieldset style="margin: 50px 100px;background-color: #cccccc;padding: 30px;border: 1px solid #ccc">
         <legend style="background-color: #ccccff;padding: 20px;font-weight: bold;font-size: 18px">Create Template Page</legend>
         <form name="frm_main" action="" method="POSt">
              <input class="text" type="text" name="tp_name" size="50" />
              <br />
              <input class="button" type="submit" value="Create Template Page" name="btn_submit" />
         </form>
    </fieldset>
    <?php

}


// Filter page template
add_filter('page_template', 'catch_plugin_template');

// Page template filter callback
function catch_plugin_template($template) {
    // If tp-file.php is the set template
    if( is_page_template('tp-file.php') )
        // Update path(must be path, use WP_PLUGIN_DIR and not WP_PLUGIN_URL) 
        $template = WP_PLUGIN_DIR . '/tp-test/tp-file.php';
    // Return
    return $template;
}

Hoffe, das hilft, die Dinge zu klären .. :)

9
t31os

Der page_template-Filter ist jetzt veraltet. ( http://adambrown.info/p/wp_hooks/hook/page_template )

Verwenden Sie stattdessen single_template (oder archive_template für Archivvorlagen).

Basierend auf der Antwort von @ t31os:

// Filter page template
add_filter('single_template', 'catch_plugin_template');

// Page template filter callback
function catch_plugin_template($template) {
    // If tp-file.php is the set template
    if( is_page_template('tp-file.php') )
        // Update path(must be path, use WP_PLUGIN_DIR and not WP_PLUGIN_URL) 
        $template = WP_PLUGIN_DIR . '/tp-test/tp-file.php';
    // Return
    return $template;
}
2
docker