Cómo incluir un archivo usando get_template_part() en un plugin
Una pregunta muy simple tal vez, pero estoy teniendo dificultades. En el desarrollo de temas, he trabajado con get_template_part()
muchas veces y entiendo sus conceptos básicos. Pero cuando estoy desarrollando un plugin, al usarlo me muestra algunos errores:
Notice: Use of undefined constant STYLESHEETPATH - asumido 'STYLESHEETPATH' en
...\wp-includes\template.php
en la línea 407
y
Notice: Use of undefined constant TEMPLATEPATH - asumido 'TEMPLATEPATH' en
...\wp-includes\template.php
en la línea 410
Buscando en Google el problema mostró una solución de soporte:
Pero eso parece una solución muy complicada - lo dudo. Creo que no debería ser tan complicado. Revisé esta Respuesta de WPSE y encontré esta línea de código:
if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
include( 'loop-mycustomposttype.php' );
Donde hay una función PHP include()
. Según mi conocimiento de WordPress, aprendí a preferir get_template_part()
sobre el include()
de PHP. Entonces, ¿cómo puedo usar exactamente un simple get_template_part()
en mi plugin?
No estoy usando ningún bucle ni nada similar, solo estoy separando (o podría decir organizando) mi código del plugin en diferentes archivos para que en algunos casos, simplemente los comente para eliminarlos donde no sean necesarios. Intenté:
get_template_part( 'my', 'special-admin' );
y luego después del error, lo cambié a:
get_template_part( 'my', 'specialadmin' );
Pero sabes que ese no es el problema. Estoy en un servidor local, usando WAMP.

get_template_part
es una función de tema. No puedes cargar archivos de plugins con esa función. Si revisas el código fuente, notarás que el trabajo lo realiza locate_template
. Observa ese código fuente y verás que siempre carga desde directorios de temas.
Por mucho que quieras usar get_template_part
, es la función incorrecta.
Tendrás que usar include
para tus archivos.
La razón, al menos desde mi perspectiva, para get_template_part
es permitir que los temas sean extendidos — es decir, facilitar la creación de temas hijos. Los plugins no están diseñados para ser extendidos de esa manera, así que no hay necesidad de get_template_part
ni de ningún equivalente para plugins.

@s_ha_dum tiene razón en que get_template_part
es una función del tema, pero se equivoca al decir que los plugins no están diseñados para extenderse de esta manera. Simplemente es más complicado.
Este artículo de Pippin, describe cómo usar una función que se encargará de cargar las plantillas de tu plugin, permitiendo a los usuarios sobrescribir las plantillas del plugin desde su tema.
Básicamente, busca en una carpeta especial dentro del tema, y si no las encuentra allí, busca dentro de la carpeta de plantillas del plugin.

Como se mencionó anteriormente, no puedes usar get_template_part
en plugins, pero hay una útil clase en Github (creada por Gary Jones) que imita la funcionalidad de get_template_part
en plugins, añadiendo el plugin al fallback (tema hijo > tema padre > plugin).
De esta manera, puedes sobrescribir la "parte de plantilla" de tu plugin dentro de un tema hijo o un tema padre.
Uso (tomado de las instrucciones del repositorio de Github):
- Copia
class-gamajo-template-loader.php
en tu plugin. Puede estar en un archivo en la raíz del plugin o, mejor aún, en un directorio includes. - Crea un nuevo archivo, como
class-your-plugin-template-loader.php
, en el mismo directorio. - Crea una
class
en ese archivo que extiendaGamajo_Template_Loader
. - Sobrescribe las propiedades de la clase para adaptarlas a tu plugin. También puedes sobrescribir el método
get_templates_dir()
si no es adecuado para ti. - Ahora puedes instanciar tu clase personalizada de cargador de plantillas y usarla para llamar al método
get_template_part()
. Esto podría ser dentro de un callback de shortcode o algo que quieras que los desarrolladores de temas incluyan en sus archivos.
Código de ejemplo:
// Cargador de plantillas instanciado en otro lugar, como el archivo principal del plugin.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;
// Úsalo para llamar al método get_template_part(). Esto podría estar dentro
// de un callback de shortcode o algo que quieras que los desarrolladores
// de temas incluyan en sus archivos.
$meal_planner_template_loader->get_template_part( 'recipe' );
// Si deseas pasar datos a la plantilla, llama al método set_template_data()
// con un array antes de llamar a get_template_part().
// set_template_data() devuelve el objeto cargador para permitir el encadenamiento de métodos.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );
$meal_planner_template_loader
->set_template_data( $data );
->get_template_part( 'recipe' );
// El valor de bar ahora está disponible dentro de la plantilla recipe como $data->foo.
// Si deseas usar un nombre de variable diferente, añade un segundo parámetro
// a set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );
$meal_planner_template_loader
->set_template_data( $data, 'context' )
->get_template_part( 'recipe', 'ingredients' );
// El valor de bar ahora está disponible dentro de la plantilla recipe como $context->foo.
