Cómo incluir un archivo usando get_template_part() en un plugin

28 nov 2013, 17:38:59
Vistas: 51.7K
Votos: 29

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.

0
Todas las respuestas a la pregunta 3
0
19

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.

28 nov 2013 17:56:19
0
15

@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.

24 jun 2015 22:04:03
0

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):

  1. 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.
  2. Crea un nuevo archivo, como class-your-plugin-template-loader.php, en el mismo directorio.
  3. Crea una class en ese archivo que extienda Gamajo_Template_Loader.
  4. 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.
  5. 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.
7 may 2017 23:34:05