Agregar código a una entrada usando filtros en WordPress

El título de la entrada puede parecer confuso para más de uno. Quienes estén acostumbrados a trabajar con WordPress seguramente saben que el contenido de un post puede mostrarse en pantalla con esta simple instrucción dentro del bucle de WordPress.

Entonces, si esa es la forma de mostrar la entrada, alguno puede pensar que para agregar contenido antes o después, solo basta con poner HTML arriba de la instrucción o debajo. Por supuesto que todo lo que pongamos antes se mostrará encima y todo lo que pongamos luego, se verá debajo. El problema aparece cuando algunos plugins introducen contenido propio al final del post, pero antes de lo que nosotros queremos mostrar.

Voy a explicarlo mejor con un ejemplo práctico. El plugin Author Box After Post está hecho para incluir un recuadro con información del autor de la entrada debajo de la misma. Funciona excelente, pero todo el código que aparece debajo de la llamada al contenido, queda también por debajo del recuadro que inserta el plugin. En otras palabras, el plugin se queda con el espacio que hay entre la entrada y el HTML que viene debajo.

Mi problema era que yo quería introducir un anuncio de AdSense antes del recuadro de Author Box After Post. No importa donde intentara ponerlo, siempre quedaba debajo del código insertado por este plugin. Eso me hizo pensar que entonces también el plugin está insertado dentro de the_content(), es decir, forma parte del contenido. La siguiente pregunta que me hice fue ¿Entonces cómo hizo para meterse ahí? Investigando el código, descubrí los filtros en WordPress.

Los filtros sirven, como su nombre lo indica, para filtrar los datos antes de que salgan por pantalla. En realidad, son una clase más de hooks (o ganchos). De esta forma, es posible agregar código al contenido antes de poder visualizarlo. Los filtros se pueden añadir a una gran cantidad de elementos. Pueden ver la lista completa en el siguiente enlace: Plugin API/Filter Reference. El que voy a explicar ahora es para agregar código al contenido.

En primer lugar, como todo código que aporta funcionalidad a nuestro tema, el lugar indicado de la plantilla para ubicarlo es el archivo functions.php. En ese archivo deben registrarse las barras de plugins, incluirse scripts de Javascript y CSS y, por supuesto, algún que otro hook necesario. Como no podía ser de otra manera, también deben ponerse los filtros.

Vamos a ver cómo es la función add_filter, encargada de agregar un nuevo filtro.

Viene el nombre de la función, se abren paréntesis y van los parámetros.

  • $tag es el nombre del filtro, que se puede buscar en el enlace que indiqué más arriba.
  • $function_to_add es el nombre de la función vinculada, la que se va a ejecutar para realizar el filtrado. Se la suele llamar callback.
  • $priority indica el orden de carga de lo que vayamos a introducir. Esto es importante, porque pensemos que puede haber muchos filtros de contenido. En mi caso, el plugin que ponía el recuadro de autor ya tenía uno. La prioridad va de 1 a 10 siendo los números más cercanos al 1 los que primero se ejecutan. Si dos filtros tienen el mismo valor, entonces se ejecutan en el orden en que fueron cargados. Si no se especifica una prioridad, el valor por defecto es 10.
  • $accepted_args es el número de argumentos que la función acepta. Por defecto va a ser 1 y ya vamos a ver cuál es ese argumento.

Ahora sí, veamos un ejemplo completo de add_filter con la función asociada.

add_filter(‘the_content’, ‘mostrar_ejemplo’,1);

En add_filter utilizamos el filtro the_content, para filtrar la entrada. mostrar_ejemplo es el nombre de la función asociada, que aparece debajo. La prioridad es 1, así que cualquier otro filtro sobre la entrada que tenga prioridad superior, se agregará después.

La función recibe un parámetro $content. Se trata del contenido completo de la entrada y es necesario ponerlo como también devolverlo al final de la función. En el medio, podemos utilizarlo y es justamente lo que hay que hacer. Como ejemplo, definí la variable $ejemplo que es un string que tiene código HTML. Luego se añade esta variable al final del contenido.

Si lo están pensando, obviamente si se hubiera agregado $content a $ejemplo, entonces el código se mostraría antes del contenido.

Soy programador web y me desempeño como Líder Técnico y de Proyectos en Polar Bear Development. Trabajo con tecnologías como PHP, Javascript, MySQL y HTML5 para el desarrollo de sitios y sistemas web. Me especializo en Zend Framework 2 y otros frameworks MVC, como también en WordPress y otros CMS. Lidero equipos de desarrolladores trabajando con Scrum. Vivo en Buenos Aires, Argentina.
 

4 thoughts on “Agregar código a una entrada usando filtros en WordPress

  1. Gracias amigo, esta es la explicación que buscaba hace mucho tiempo, es una entrada única. Pero el problema es que definitivamente no entiendo PHP y de pronto hago un daño en mi blog. jaja. Gracias

  2. Milton

    No esperes que todo salga bien en el primer intento. Para poder aprender hay que romper. Así que está perfecto que asumas el riesgo de tocar el código.

    Saludos

  3. Hola, tengo un problema, necesito agregar cierto codigo a unas entradas espesificas, el problema es que no se como obtener toda la informacion que viene desde el the_content(); y en tu ejemplo dices “La función recibe un parámetro $content. Se trata del contenido completo de la entrada y es necesario ponerlo como también devolverlo al final de la función.” Pero como asigno todo el contenido de the_content a la variable $content.

  4. Hola Mike
    La variable $content tiene todo el contenido de tu entrada. Es un gran HTML con mucho contenido dentro. Si lo que deseas es agregar el código a una entrada específica tendrías que manipular el contenido de $content de alguna manera, utilizando alguna herramienta que te permita parsear XML. Otra forma más eficaz es utilizar algún callback específico de WordPress.
    Si no me expliqué o seguís en duda, preguntame de nuevo.
    Perdón por la demora en la respuesta.
    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*