Agregar una página de plantilla personalizada mediante programación

6

Estoy tratando de agregar una página de plantilla desde un complemento, y mi página de plantillas está en esta carpeta de complementos. ¿Es esto posible? Aquí está mi código:

 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 es mi página de plantilla personalizada. Cuando coloco ese archivo en la carpeta my-theme, funciona bien, pero quiero hacer esto con el archivo de la carpeta de complementos para no forzar a los usuarios para copiar ese archivo de la carpeta de complementos a la carpeta de plantillas. ¿Es esto posible? ¿Alguna idea?

    
pregunta user1147 29.03.2011 - 13:14

2 respuestas

9

El artículo vinculado está en el camino correcto, pero lo haré más simple para ti ...;)

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

El filtro básicamente busca si su plantilla de página especial está configurada para la página actual, si lo está, actualiza la ruta para que apunte a su plantilla de complementos.

Solo asegúrate de que la ruta sea correcta, de lo contrario, verás los errores de inclusión ... :)

Seguimiento # 1

El primer problema es que WordPress valida cualquier conjunto de plantillas como plantilla de página, es decir. comprueba si el archivo está en la carpeta del tema, y es un archivo de plantilla válido; si no, lo omite e incluye una plantilla más genérica, como page.php ...

Sin embargo, esto no cambia el hecho de que el metacampo aún mantiene el valor de su plantilla personalizada, y también is_page_template( 'tp-file.php' ) devolverá correctamente verdadero si se usa en lugar de mi declaración condicional anterior, por ejemplo ...

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

NOTA: cambié el código para usar WP_PLUGIN_DIR , ya que la constante WP_PLUGIN_URL no es adecuada para rutas ... (incluye debe usar una ruta , no una URL).

Un problema, y esto realmente no es algo que pueda solucionarse, es que al ver la página desde el área de administración, al editar la página, la plantilla no se mostrará como la plantilla activa, y el guardar los cambios podría Por supuesto cambiar la plantilla activa. Hay mucho que podemos hacer allí, el menú desplegable de la plantilla de la página se genera a partir de una función que analiza los archivos de temas, no hay ningún gancho en el lugar que pueda ver que nos permita ampliar la lista con plantillas de complementos.

Personalmente, lo que sugeriría sugerir , como una solución alternativa sería guardar un meta campo adicional con cada página que se creó con su página de complemento especial, luego agregar un gancho en save_post o wp_insert_post_data y verifique si este meta campo existe, si es así, también verifique que la plantilla de la página esté establecida en tp-file.php y, si no, actualícela a tp-file.php . El meta campo adicional sería solo una bandera, por así decirlo, para indicar qué páginas necesitan tener su plantilla de complemento adjunta.

Aquí está tu plugin trabajando en su forma más básica (sí, lo probé) ... :)

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

Espero que ayude a aclarar las cosas ... :)

    
respondido por el t31os 30.03.2011 - 01:21
2

El filtro page_template está en desuso ahora. ( enlace )

Intenta usar single_template (o archive_template para las plantillas de archivo) en su lugar.

Basado en la respuesta 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;
}
    
respondido por el docker 23.06.2016 - 16:20

Lea otras preguntas en las etiquetas