¿Existe un complemento de WordPress que registre un archivo de complemento como una plantilla de página personalizada?

9

Necesito crear un complemento que haga que las plantillas de página personalizadas estén disponibles en wp-admin. Me pregunto si alguien ya ha abordado esto, ya que parece un proceso bastante típico.

jnthnclrk
fuente
No entiendo bien la pregunta. ¿Desea un complemento que inserte plantillas personalizadas definidas en el complemento?
Steven

Respuestas:

7

Al igual que Rarst respondió, realmente puede hacer eso sin editar archivos principales o eliminar el metabox de atributos de la página y crear su uso con el mismo código con un poco de modificación. el código a continuación es el código para /admin/include/meta-boxes.php y agregué un comentario para mostrar dónde irían las opciones adicionales de plantilla de página:

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
}

No sé si esto es una solución en su caso, pero tuve un caso de smiler cuando necesitaba mostrar el tipo de publicación en un tema incorporado en el complemento y para eso utilicé add_filter('the_content', 'my-function'); y my-function creó la salida para mostrar.

Otra opción sería hacer que su complemento cree el archivo de plantilla en el directorio del tema actual, algo como esto:

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

y puede ejecutar esto después de verificar por primera vez si el archivo existe

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

Espero que uno de esto ayude.

Bainternet
fuente
Probará cosas de meta box, bus según mi respuesta, es solo una parte del problema, otro es el código que intenta cargar la plantilla solo si está en el directorio de temas. Por lo tanto, proporcionar un archivo de plantilla "externo" puede no ser suficiente para cargarlo.
Rarst
Es por eso que sugerí hacer que el complemento cree los archivos en el directorio del tema.
Bainternet
2

No estoy completamente seguro de entender lo que estás tratando de lograr, al menos por qué querrías que un complemento lo haga.

El procedimiento normal para crear diferentes plantillas de página es:

  1. Cree una nueva plantilla de página en su directorio de temas ACTIVE (haga una copia de page.php).

  2. Cambie el nombre de la plantilla (dentro del archivo).

    / * Nombre de la plantilla: página de ancho completo * /

  3. Cambie el código de la página a lo que está tratando de lograr.

  4. Ahora puede ir a crear una nueva página y elegir qué "Plantilla" usar.

texto alternativo

...

Espero que eso sea lo que intentas lograr.

Documentación oficial aquí: http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates

Lars Koudal
fuente
Woops El código PHP de muestra está un poco desordenado. Visite el enlace para ver el ejemplo de código adecuado.
Lars Koudal
2
Interesado en saber si alguien está usando el método de Jan en un complemento existente: wordpress.stackexchange.com/questions/3396/…
jnthnclrk
Creo que @trnsfrmr está buscando una forma de crear una plantilla de página predefinida (pasos 1-3) dentro de su propio complemento para que esta plantilla esté disponible para los usuarios después de la activación del complemento. Supongo que quiere mantener este tema de solución independiente.
Michal Mau
Ah, está bien, no entendí un poco allí, gracias por la aclaración :-)
Lars Koudal
2

Esto parece ser bastante difícil de lograr. get_page_templates()La función descarta activamente todo lo que no se encuentra en los directorios raíz padre e hijo. Tampoco se almacena en una variable global ni permite filtrar la lista generada de plantillas.

Creo que el cuadro meta de atributos de página deberá bifurcarse y reemplazarse por completo para esto. Y no estoy seguro de que sea posible incluso entonces.

Estoy de acuerdo en que esto parece algo que tiene sentido, pero el código de WordPress es muy preciso porque quiere que las plantillas con nombre solo provengan del directorio del tema.

Rarst
fuente
1

¿No es esta una de las razones que register_theme_directory()se introdujo?

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

En ese momento era un problema relacionado con BuddyPress, que quería incluir plantillas adicionales aquí y allá.

Sin embargo, supongo que no figuran correctamente como plantillas de página:

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

Denis de Bernardy
fuente
Revisaré el código (probablemente mañana), pero hasta donde recuerdo, las plantillas con nombres se buscan explícitamente solo a través de constantes de ruta.
Rarst