Incluir plantillas personalizadas en nuestros complementos de WordPress
Creo que uno de los aspectos más subestimados, o quizás uno de los aspectos raramente discutidos del desarrollo de complementos personalizados, es la capacidad de incluir plantillas personalizadas en nuestros complementos de WordPress.
Y, para ser honesto, lo entiendo: soy bastante firme en lo que debería ser un complemento y lo que debería ser un tema.
Eso es:
- los temas son para presentación,
- Los complementos son funcionalidad.
Si incluyo plantillas en un complemento, ¿no estoy haciendo lo mismo que cuando los desarrolladores incluyen funcionalidad en sus temas?
Como con tantas cosas en desarrollo, creo que depende. Quiero decir, agregar muchas funciones que te encierran en un tema es algo de lo que no soy fanático. Del mismo modo, si tiene un complemento destinado a mostrar datos en el front-end y es independiente del tema, entonces tiene sentido.
Así que tienes que ser juicioso en tus decisiones.
Independientemente, hay un conjunto común de pasos que podemos usar al incluir plantillas personalizadas en nuestros complementos de WordPress.
Y eso es lo que esta publicación va a mostrar.
Si va a incluir plantillas personalizadas en el complemento, supondré que está utilizando plantillas únicas y de archivo. De lo contrario, use solo los ganchos y el código a continuación que necesita.
Para ambos, sin embargo, sepa esto:
Usando estos ganchos, puede decirle a WordPress dónde residen las plantillas personalizadas en su complemento.
Organización de plantillas
Para mí, generalmente tengo un directorio de plantillas en mi complemento que ubica al mismo nivel que los directorios de activos, src y proveedor.
Esto facilita saber dónde residen y proporciona una forma consistente de incluirlos en todos los complementos que creó. Después de todo, hay algo que decir para ser consistente en las convenciones que usamos.
Incluyendo las Plantillas
Suponiendo que tiene una plantilla single-acme.php y una plantilla archive-acme.php, es fácil incluirla. Y aunque soy más fanático del uso de la programación orientada a objetos, mostraré cómo incluir estas plantillas usando código de procedimiento.
Si lo desea, es fácil convertir este código en código orientado a objetos. Además, voy a suponer que también incluyes esto para los tipos de publicaciones personalizadas.
Siempre puede omitir un condicional para un tipo de publicación personalizada si desea simplemente incluir estas plantillas pero, en mi experiencia, encuentro raro que estas situaciones no usen tipos de publicación personalizada, pero no conozco su situación.
Dicho esto, aquí está el código.
Definición de ganchos
Primero, necesitamos definir los ganchos. Esto es relativamente simple ya que vamos a usar los ganchos descritos anteriormente.
Primero, la plantilla única :
<?php
add_action('single_template', 'acmeIncludeSingleTemplate');
/**
* Includes a custom, single template as included in a plugin. If
* the template is being viewed for a custom post type then use it;
* otherwise, use the template that's provided by WordPress at runtime.
*
* @param string $originalTemplate the path to the original template
*
* @return string the path to the original template or the custom template.
*/
function acmeIncludeSingleTemplate($originalTemplate)
{
// More to come...
}
Y luego la plantilla de archivo :
<?php
add_action('archive_template', 'acmeIncludeArchiveTemplate');
/**
* Includes a custom, archive template as included in a plugin. If
* the template is being viewed for a custom post type then use it;
* otherwise, use the template that's provided by WordPress at runtime.
*
* @param string $originalArchiveTemplate the path to the original template
*
* @return string the path to the original template or the custom template.
*/
function acmeIncludeArchiveTemplate($originalArchiveTemplate)
{
// More to come...
}
Y ahora podemos implementar el código para cada una de las funciones.
Agregar el código
Entonces, primero, veremos la plantilla única :
<?php
add_action('single_template', 'acmeIncludeSingleTemplate');
/**
* Includes a custom, single template as included in a plugin. If
* the template is being viewed for a custom post type then use it;
* otherwise, use the template that's provided by WordPress at runtime.
*
* @param string $originalTemplate the path to the original template
*
* @return string the path to the original template or the custom template.
*/
function acmeIncludeSingleTemplate($originalTemplate)
{
$singleTemplate = plugin_dir_path(
dirname(
__DIR__) );
$singleTemplate .= '/templates/single-acme.php';
if ('acme-cpt' === get_post_type(get_the_ID())) {
if (file_exists($singleTemplate)) {
return $singleTemplate;
}
}
return $originalTemplate;
}
Y ahora la plantilla de archivo :
<?php
add_action('archive_template', 'acmeIncludeArchiveTemplate');
/**
* Includes a custom, archive template as included in a plugin. If
* the template is being viewed for a custom post type then use it;
* otherwise, use the template that's provided by WordPress at runtime.
*
* @param string $originalArchiveTemplate the path to the original template
*
* @return string the path to the original template or the custom template.
*/
function acmeIncludeArchiveTemplate($originalArchiveTemplate)
{
$archiveTemplate = plugin_dir_path(
dirname(
__DIR__) );
$archiveTemplate .= '/templates/archive-acme.php';
if ('acme-cpt' === get_post_type(get_the_ID())) {
if (file_exists($archiveTemplate)) {
return $archiveTemplate;
}
}
return $originalArchiveTemplate;
}
Si ha prestado mucha atención al código, sabe que hay muy pocas cosas diferentes. De hecho, el proceso general se puede resumir de la siguiente manera:
- definir el gancho,
- localizar la plantilla,
- verifique el tipo de publicación personalizada,
- la plantilla existe, utilízala
- de lo contrario, use la plantilla predeterminada
Y este es el proceso para las plantillas individuales y de archivo.
Escritura de plantillas compatibles
Y finalmente, y esto es importante especialmente si desea que la plantilla sea lo más agnóstica posible, trato de usar tantas etiquetas de plantilla de WordPress integradas como sea posible cuando muestre el contenido relacionado con el complemento. Esto permite a los desarrolladores de temas diseñarlo fácilmente para que encaje con su tema.
No, no podrá acomodar todos los temas, pero esa es la naturaleza de los temas de WordPress. El punto es tomar tanto trabajo de recuperación y representación de datos de la plantilla como sea posible para que los desarrolladores front-end puedan administrarlos fácilmente.

