Complemento de tipo de publicación personalizada: ¿Dónde pongo la plantilla?

11

Estoy escribiendo un complemento de tipo de publicación personalizado. Parte de esto lo estoy enviando a la plantilla a través de códigos cortos. Pero otras partes necesitan una plantilla de publicación personalizada, y descubrí cómo usar la jerarquía de plantillas para los CPT. Pero la plantilla personalizada está en el tema, y ​​creo que el complemento debería ser autónomo, al menos para empezar.

Entonces, ¿cuál es la mejor práctica aquí? ¿Cómo incluimos archivos de plantilla en un complemento CPT? ¿Me puede señalar ejemplos especialmente buenos de cómo se hace esto?

Gracias por tu ayuda.

NotoriousWebmaster
fuente
1
No estoy seguro de que sea un duplicado, pero es una pregunta subjetiva. La mejor práctica para mí sería dejar que el tema lo maneje. Las mejores prácticas para otros serían hacer que el complemento sea completamente autónomo.
chrisguitarguy
@JohannesPille Hice una búsqueda antes de preguntar. Pero gracias por el enlace. Lo investigaré.
NotoriousWebmaster
1
@chrisguitarguy De acuerdo. Mi problema al dejar que el tema lo maneje es que si cambiamos de tema, tenemos que hacer algunas personalizaciones para acomodar el complemento. De lo contrario, perdemos las cosas que el CPT trae a la fiesta.
NotoriousWebmaster

Respuestas:

8

Entonces, ¿cuál es la mejor práctica aquí?

Yo diría una combinación de dejar que el tema lo maneje y proporcionar un valor predeterminado con su complemento.

Puede usar el single_templatefiltro para cambiar la plantilla. En su devolución de llamada, vea si el tema proporcionó una plantilla para el tipo de publicación, si lo hizo, no haga nada.

<?php
add_filter('single_template', 'wpse96660_single_template');
function wpse96660_single_template($template)
{
    if ('your_post_type' == get_post_type(get_queried_object_id()) && !$template) {
        // if you're here, you're on a singlar page for your costum post 
        // type and WP did NOT locate a template, use your own.
        $template = dirname(__FILE__) . '/path/to/fallback/template.php';
    }
    return $template;
}

Me gusta este método lo mejor. Combínelo con proporcionar un conjunto de sonido de "etiquetas de plantilla" (por ejemplo the_content, the_title) que admitan cualquier dato personalizado que acompañe a su tipo de publicación y le brinde al usuario final una gran capacidad de personalización junto con algunos valores predeterminados de sonido. Bbpress hace este tipo de cosas realmente bien: incluye plantillas de usuario si las encuentra y proporciona muchas etiquetas de plantilla.

Alternativamente, puede usar una devolución de llamada con the_contentfiltro y simplemente cambiar cosas en el contenido en sí.

<?php
add_filter('the_content', 'wpse96660_the_content');

function wpse96660_the_content($content)
{
    if (is_singular('your_post_type') && in_the_loop()) {
        // change stuff
        $content .= '<p>here we are on my custom post type</p>';
    }

    return $content;
}
chrisguitarguy
fuente
Estoy de acuerdo con @toscho en que no hay una solución limpia. Pero me gusta el concepto de ofrecer un conjunto de etiquetas de categoría. Sospecho que finalmente tendré una carpeta de temas en mi plugin, con una plantilla de CPT de muestra, y recomendaré a los usuarios que la adapten a sus circunstancias. También me gusta el filtro the_content, porque eso conecta mi contenido dentro del diseño del usuario. Puedo implementar ambos y permitir que el usuario elija qué camino tomar con una opción de alternar.
NotoriousWebmaster
3

Puede conectar template_includey devolver su archivo de complemento si la solicitud es para su tipo de publicación:

add_filter( 'template_include', 'insert_my_template' );

function insert_my_template( $template )
{
    if ( 'my_post_type' === get_post_type() )
        return dirname( __FILE__ ) . '/template.php';

    return $template;
}

Pero esto cambiará drásticamente el aspecto. Todavía no hay una solución limpia.

fuxia
fuente
Sí, tienes razón, cambiaría el aspecto, incluido el diseño, los widgets y demás. Demasiado radical para mi gusto. Pero gracias.
NotoriousWebmaster