El poder de los filtros en Genesis Framework
Mientras configuraba la información del autor en Genesis Framework me encontré con un pequeño problema.
Quería agregar un enlace desde la biografía del autor hacia su perfil de Google+, utilizando el atributo rel="me author" para que Google pudiera asociar correctamente ambos perfiles. Sin embargo, aunque el código HTML era correcto, el enlace nunca aparecía en la página.
Después de revisar un poco descubrí la causa.
Genesis filtra parte del contenido HTML que puede mostrarse dentro de la descripción del autor. Algunas etiquetas y atributos considerados potencialmente inseguros simplemente son eliminados antes de que el contenido llegue al navegador.
La primera solución que encontré consistía en ignorar completamente la descripción del autor e insertar el enlace manualmente utilizando un hook.
add_action ('genesis_after_endwhile', 'cyberia_author_gplus');
function cyberia_author_gplus() {
if ( is_author() ) {
$google_profile = get_the_author_meta( 'google_profile' ); ?>
<div class="gplus">
<p>El perfil del autor en
<a rel="me author"
href="<?php echo esc_url( $google_profile ); ?>/about?rel=author">
<img class="plus"
src="http://ssl.gstatic.com/images/icons/gplus-16.png"
width="16"
height="16"
border="0"
align="">
<strong>Google+</strong>
</a>
</p>
</div>
<?php
}
}
El resultado funciona correctamente.
La función obtiene la dirección del perfil almacenada en los metadatos del autor y genera un pequeño bloque HTML al finalizar el loop.
Sin embargo, la ubicación no era la ideal. El enlace terminaba apareciendo después de la navegación de la página y, además, duplicaba información que realmente debería formar parte de la biografía del autor.
Después encontré una solución mucho más limpia.
Aprovechando los filtros de Genesis
Una de las mayores ventajas de Genesis es que gran parte de su funcionamiento puede modificarse mediante filtros.
En lugar de reemplazar una función completa o agregar contenido adicional, muchas veces basta con modificar los datos que una función utiliza internamente.
En este caso existe una función llamada genesis_formatting_allowedtags() que devuelve un arreglo con todas las etiquetas HTML permitidas dentro del contenido filtrado por Genesis.
Lo único que necesitamos hacer es ampliar la definición de la etiqueta <a> para permitir también el atributo rel.
add_filter(
'genesis_formatting_allowedtags',
'cyberia_filter_author_description',
5,
1
);
function cyberia_filter_author_description($intro_text) {
$genesis_formatting_allowedtags['a'] = array(
'href' => array(),
'title' => array(),
'rel' => array(),
);
return $genesis_formatting_allowedtags;
}
La función asociada al filtro devuelve nuevamente el arreglo de etiquetas permitidas, pero ahora indicando que los enlaces también pueden utilizar el atributo rel.
Con ese único cambio Genesis deja de eliminar dicho atributo y el enlace puede escribirse directamente dentro de la descripción del autor.
¿Por qué utilizar un filtro?
Ambas soluciones producen el mismo resultado visible para el usuario.
La diferencia está en la forma de conseguirlo.
Utilizando un hook agregamos un nuevo bloque de contenido al final de la página.
Utilizando un filtro modificamos el comportamiento de Genesis para que el contenido original pueda mostrarse correctamente.
En este caso el filtro resulta una solución más elegante porque conserva la estructura normal del tema y evita generar HTML adicional únicamente para sortear una restricción del framework.
Ésa es, precisamente, una de las ideas más interesantes de Genesis.
Muchas veces no necesitamos reemplazar una función completa ni copiar grandes fragmentos de código. Basta con localizar el filtro adecuado y modificar únicamente aquello que realmente queremos cambiar.