¿Cómo usar get_template_part ()?

25

¿Podría alguien explicarme cómo funciona esta función? Sé lo que hace, pero cuando miro el código fuente en la plantilla twenty_ten, no entiendo cómo se recopilan todos los bucles en un solo loop.php (también vi ese archivo).

Entonces, ¿cómo, por ejemplo, abstraer cierta parte común de la plantilla y luego reutilizarla en otras plantillas?

Amit Erandole
fuente

Respuestas:

25

Algunas muy buenas respuestas introductorias aquí.

Básicamente, get_template_part()permite a los desarrolladores de temas configurar un orden de especificidad de los archivos de plantilla. Piénselo de manera similar a la especificidad que se aplica a los selectores CSS. Al diseñar algo, debe comenzar con el mínimo de especificidad, de modo que pueda anularse fácilmente en partes de un diseño que requieren atención individual.

Entonces, por ejemplo, estás diseñando un blog y creas un archivo loop.php que funciona bien para marcar publicaciones. Pero planifica con anticipación, y luego lo llama en sus archivos de plantilla con especificadores de contexto adicionales: por ejemplo, en la página de índice, llama get_template_part( 'loop', 'index' );, en la plantilla única, llama get_template_part( 'loop', 'single' );, en páginas de archivo, llama get_template_part( 'loop', 'archive' );, etc. Esto hace que sea muy fácil en el futuro cuando decidas marcar el bucle en tus páginas de archivo de manera diferente a la página de inicio: solo crea una plantilla loop-archive.php y se usará en lugar del loop genérico.php .

Pero la magia detrás get_template_part()está en la función locate_template(), que comprueba primero el directorio del tema, luego el directorio principal (si existe) para el archivo nombrado. Esto es muy útil para el desarrollo de complementos. En uno de mis complementos, defino un tipo de publicación personalizada y creé un archivo de plantilla de bucle para ese tipo de publicación personalizada en mi directorio de complementos. Pero ... quiero permitir que los temas que usan mi complemento anulen mi marcado si así lo desean. Aquí es donde locate_template()realmente funciona maravillas.

locate_template($template_names, $load = false, $require_once = true )

buscará cada uno de los nombres en la matriz $ template_names en el directorio de la hoja de estilo, luego en el directorio de la plantilla. Pasar 'verdadero' como el argumento $ load significa que requerirá el primer archivo encontrado y devolverá una cadena vacía si no se encontró un archivo de plantilla. Entonces puedo hacer algo como esto en mi plugin:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

... lo que con suerte debería facilitar mucho a los desarrolladores de temas personalizar mi complemento con solo incluir un archivo llamado loop-mycustomposttype.php en su tema.

goldenapples
fuente
2
Reemplace localizar_templato por esto, por favor. include(locate_template( 'loop-mycustomposttype.php')) De esta manera es posible pasar variables. He encontrado este enlace aquí . ¡Es extremadamente útil!
Pablo SG Pacheco
1
Al hacerlo, será necesario cambiar esto si también. Me gusta estoif ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo SG Pacheco
1
Oh, buen punto. Con la fórmula que proporcioné, el requireor require_oncecall (from locate_template) está dentro de una función y, por lo tanto, no tiene acceso al alcance actual.
goldenapples
5

No todos los bucles, el bucle principal. ;-) No importa si mira su página principal o una categoría o quién sabe qué, siempre tendrá un bucle principal. El contenido de ese bucle principal está determinado por la consulta que se ejecutó antes de que se llamara a su plantilla.

La plantilla loop.php simplemente se ejecuta sobre los elementos en el bucle y los formatea. Consulte la documentación en el Codex .

Si miras el loop.php de Twenty-Ten, puedes ver que Twenty-Ten luego se diversifica dentro de ese único archivo de plantilla.

get_template_part()simplemente carga una parte de la plantilla y la ejecuta. También puede extraer partes de su loop.php en archivos separados y reemplazarlas por get_template_part('loop', 'category')llamadas y así sucesivamente.

O podría tener una plantilla parcial para cada publicación individual en el bucle y hacer que su loop.php solo llame get_template_part('loop','post');dentro de la while...cláusula. Todo depende de ti.

wyrfel
fuente
3

Desde el códice get_template_part :

<?php get_template_part( 'loop', 'index' ); ?>

hará un PHP require () para el primer archivo que existe ...

Así que efectivamente funcionará como si necesitaras otro archivo php.

Actualización : hay una ligera diferencia para 'requerir': está envuelto dentro de una función, por lo que debe hacerlo globalsi desea pasar cualquier variable de su plantilla a su parte de plantilla.

icc97
fuente