get_template_part vs action hooks en temas de WordPress

18 oct 2010, 11:34:26
Vistas: 4.12K
Votos: 17

Parece que ambos métodos permiten al usuario final modificar un tema sin editar directamente los archivos del tema (mediante temas hijos).

Mi pregunta es, ¿hay un método preferible sobre el otro?

Por ejemplo, con un tema en el que estoy trabajando ahora. Estoy intentando decidir si usar partes de plantilla o hooks.

<?php get_template_part('before_sitecontainer' ); ?>
<div id="sitecontainer" class="sitecontainer" <?php //cerrado en el footer ?>>

<?php get_template_part( 'before_topcontainer' ); ?>
<div id="topcontainer ">

    <?php get_template_part( 'before_topedge_navigation' ); ?>
    <?php get_template_part( 'topedge_navigation' ); ?>

    <?php get_template_part( 'before_site_header' ); ?>  
    <?php get_template_part( 'site_header' ); ?>

    <?php get_template_part( 'before_second_navigation' ); ?>
    <?php get_template_part( 'second_navigation' ); ?>

    <?php get_template_part( 'after_second_navigation' ); ?>

</div><!-- fin del div topcontainer -->
<?php get_template_part( 'after_topcontainer' ); ?>

El código anterior permite al usuario del tema reemplazar cualquier sección existente simplemente creando un archivo con el nombre apropiado en su carpeta de tema hijo, así como añadir nuevo código antes/después de cada sección preexistente mediante el mismo método - los archivos de partes de plantilla before/after no existen en el tema padre y están ahí solo para permitir insertar código - este método no requiere que entiendan hooks/filters para lograrlo.

Por supuesto, podría lograr lo mismo usando hooks y filters.

¿Hay alguna ventaja en usar hooks/filters en su lugar? Teniendo en cuenta que el público objetivo que usará esto definitivamente no tiene conocimientos de código. Puedo darles instrucciones relativamente básicas que pueden seguir para usar el método de plantillas pero casi seguro los confundiría mucho con hooks.

¿O hay situaciones donde uno sería mejor que el otro dentro del mismo tema?

0
Todas las respuestas a la pregunta 3
1
10

Prefiero los hooks, ya que son más flexibles: puedes engancharte a ellos desde el archivo functions.php de tu tema, pero también desde plugins. Intento poner tanta lógica como sea posible en plugins, para que los temas contengan principalmente elementos de diseño.

Si usas un action hook, todavía es posible utilizar get_template_part() en el manejador de ese hook. Esto te da lo mejor de ambos mundos. Incluso podrías crear un hook predeterminado que llame a get_template_part(), para que las personas con poca experiencia en codificación puedan agregar archivos adicionales, y otros puedan eliminar este hook si no lo desean.

En cuanto al rendimiento: get_template_part() utiliza (en locate_template()) file_exists() una, dos o cuatro veces (dependiendo de cómo lo llames). Parece que file_exists() es muy rápido, y utiliza caché en PHP y tal vez incluso en el sistema operativo. Así que probablemente no sea un problema.

19 oct 2010 09:48:00
Comentarios

Tiene sentido. Parte de mi enfoque de diseño ha sido eliminar la necesidad de plugins en las situaciones de uso más comunes, manteniendo al mismo tiempo la capacidad de usarlos para aquellos que lo deseen. Mi cliente objetivo sabe muy poco sobre WordPress o plugins, no está calificado para distinguir los buenos plugins de los malos (la principal debilidad de los plugins en mi opinión) y no quiere tener que lidiar con la actualización y gestión de múltiples piezas de software. Por eso tengo que integrar mucha funcionalidad directamente en los temas para ofrecer lo que quieren: una solución fácil de usar, fácil de mantener y todo en uno.

Lemon Bacon Lemon Bacon
19 oct 2010 10:44:16
1

Diría que la principal diferencia es la legibilidad. Si ves varias partes de plantilla bien nombradas, puedes entender fácilmente lo que está sucediendo. Si solo ves un hook, tendrás que buscar en el resto del tema para establecer qué está adjunto al hook.

18 oct 2010 12:28:17
Comentarios

Sí, tiene sentido y es parte de lo que estaba intentando lograr con el código de ejemplo.

Lemon Bacon Lemon Bacon
18 oct 2010 12:39:46
5

Es (relativamente) fácil eliminar una función de un hook en un tema hijo, pero mucho más difícil hacer que ignore una plantilla no deseada del tema padre.

Esencialmente, trabajar con hooks está más cerca del lado de PHP y trabajar con plantillas está más cerca del lado de HTML. Yo uso el tema padre Hybrid, que está muy orientado a hooks. Es una maravilla hasta que necesitas deshacerte de alguna plantilla del padre.

Para los usuarios que no son expertos en tecnología, ninguna de las opciones es muy agradable. ¿Por qué tendrían que meterse con los internos del tema de esa manera?

PD: también considera los problemas de rendimiento. Las cosas con hooks ocurren en memoria, las cosas con plantillas requieren muchas búsquedas en disco. Especialmente si estás escribiendo algo como en tu ejemplo.

PPS: no es la preferencia de todos... pero en lugar de escribir un tema padre desde cero, ¿por qué no tomar un tema padre existente y proporcionar un tema hijo simple al usuario?

18 oct 2010 12:41:14
Comentarios

Ignorar una plantilla padre sería tan fácil como crear un archivo de plantilla en blanco para reemplazarlo, habría pensado. Mucho más fácil que lidiar con hooks (y por lo tanto con PHP) para usuarios no técnicos. Aunque para alguien con experiencia, los hooks serían mucho más fáciles. En cuanto al por qué, siempre hay quienes quieren personalizar, incluso tú mismo admitiste que lo haces. En cuanto a por qué estoy creando un tema, esa es la dirección en la que quiero llevar mi negocio. Construir alrededor del negocio de otro no me parece muy a prueba de futuro, además porque, en mi opinión, la mayoría de los temas existentes dejan mucho que desear. Creo que puedo hacerlo mejor.

Lemon Bacon Lemon Bacon
18 oct 2010 13:25:50

Buenos puntos sobre los problemas de rendimiento. Aunque, como WordPress fue diseñado para trabajar con get_template_part, habría pensado que no tendría tanto impacto en el rendimiento. ¿Alguien tiene algún benchmark sobre esto?

Lemon Bacon Lemon Bacon
18 oct 2010 13:27:44

Entiendo lo que quieres decir sobre ignorar una parte de la plantilla. No es tan fácil como pensaba

Lemon Bacon Lemon Bacon
18 oct 2010 13:36:59

En realidad es tan fácil como colocar un archivo de plantilla en blanco en la carpeta del child theme, siempre que esté en la raíz de la carpeta. Donde se complica es cuando los archivos de plantilla están en subcarpetas dentro de la carpeta del tema padre o del child theme

Lemon Bacon Lemon Bacon
18 oct 2010 13:40:43

En realidad, incluso las subcarpetas no son un problema. Simplemente tenía mal el nombre de la carpeta (una señal segura de que estoy trabajando demasiado tarde, jeje). Para sobrescribir una parte de la plantilla solo se requiere un archivo con el mismo nombre y en la misma ruta en el child theme que en el tema padre

Lemon Bacon Lemon Bacon
18 oct 2010 14:00:42