web-dev-qa-db-fra.com

Ajouter une page de modèle personnalisée par programme

J'essaie d'ajouter une page de modèle à partir d'un plugin, et ma page de modèle se trouve dans ce dossier. Est-ce possible? Voici mon 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 est ma page de modèle personnalisée. Lorsque je mets ce fichier dans le dossier my-theme, cela fonctionne correctement, mais je souhaite le faire avec un fichier du dossier du plugin, de sorte que je n'ai pas à forcer les utilisateurs à le copier. fichier du dossier du plugin au dossier du modèle. Est-ce possible? Une idée?

6
user1147

L'article lié est sur la bonne voie, mais je vais le rendre plus simple pour vous ..;)

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;
}

Le filtre cherche essentiellement à savoir si votre modèle de page spécial est défini pour la page en cours. Si c'est le cas, met à jour le chemin d'accès pour qu'il pointe vers votre modèle de plug-in.

Assurez-vous que le chemin est correct, sinon vous verrez des erreurs d'inclusion ... :)

Suivi n ° 1

Ok, le premier problème est que WordPress valide tout modèle défini en tant que modèle de page, c.-à-d. il vérifie si le fichier se trouve dans le dossier du thème et est un fichier modèle valide. Dans le cas contraire, il passe au-delà et inclut un modèle plus générique, comme page.php ...

Cependant, cela ne change rien au fait que le champ méta conserve la valeur de votre modèle personnalisé et que is_page_template( 'tp-file.php' ) renvoie correctement true s'il est utilisé à la place de ma précédente instruction conditionnelle, par exemple ..

// 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;
}

NOTE: J'ai changé le code pour utiliser WP_PLUGIN_DIR car la constante WP_PLUGIN_URL ne convient pas pour chemins ... (doit inclure un chemin, pas une URL).

Un problème, et ce n’est vraiment pas une solution que vous pouvez corriger, est que lors de l’affichage de la page à partir de la zone administrative, lors de la modification de la page, le modèle ne sera pas répertorié comme modèle actif et que l’enregistrement des modifications pourrait bien sûr modifier le format. modèle actif. Nous pouvons faire beaucoup de choses là-bas. La liste déroulante des modèles de page est générée à partir d’une fonction qui analyse les fichiers de thème. Il n’existe aucun crochet qui puisse nous permettre d’étendre la liste avec des modèles de plug-in.

Personnellement, ce que je ferais suggère , en tant que solution de contournement serait de sauvegarder un champ méta supplémentaire avec chaque page créée à l'aide de votre page de plug-in spécial, puis d'ajouter un point d'ancrage sur save_post ou wp_insert_post_data et de vérifier si cette méta Si ce champ existe, vérifiez également que le modèle de page est défini sur tp-file.php et, dans le cas contraire, mettez-le à jour avec tp-file.php. Le champ méta supplémentaire serait simplement un drapeau pour ainsi dire, pour indiquer quelles pages doivent avoir votre modèle de plugin attaché.

Voici votre plugin fonctionnant sous sa forme la plus élémentaire (oui j'ai testé) ... :)

<?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;
}

J'espère que ça aide à clarifier les choses .. :)

9
t31os

Le filtre page_template est obsolète maintenant. ( http://adambrown.info/p/wp_hooks/hook/page_template )

Essayez plutôt d'utiliser single_template (ou archive_template pour les modèles d'archive).

Basé sur la réponse de @ 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