Seleccionar página

wordpress-logoEn la entrada anterior vimos cómo crear la estructura básica de un plugin de WordPress. Lo cierto es que teniendo eso, nuestro plugin ya aparece en la lista de plugins instalados y podemos incluso activarlo. Evidentemente, no hace nada, pues no tiene funcionalidad.

Este es el momento en que desarrollaremos toda la funcionalidad del plugin. Ahora es vuestra imaginación la que manda. Podemos hacer una lista de funciones, una clase, un programa complejo compuesto de clases… En definitiva, podéis llegar tan lejos como vuestra imaginación y vuestros conocimientos os permitan.

En mi caso, hasta ahora, la mayoría de plugins que he desarrollado han sido en plan lista de funciones. Por poner un ejemplo extremadamente simple, imaginad que el archivo principal del plugin contiene un número indeterminado de funciones para, por ejemplo, modificar un punto concreto del Loop, crear un Tipo Personalizado, añadir una página de opciones al admin…

Pero si sabes de lo que estoy hablando, eso no funciona así. No se coloca una lista de funciones y, por ciencia infusa, funcionan (valga la redundancia). Las funciones que podemos crear sirven a dos cometidos: o bien para llamarlas manualmente desde un punto concreto del desarrollo (desde el Theme, desde un Widget propio, desde una página creada por nosotros…), o bien para que WordPress las ejecute en momentos concretos (el Loop, el Head, una página concreta del admin…). Lo primero es sencillo. La pregunta más evidente ahora es, ¿Cómo hacemos que WordPress sepa que debe ejecutar una función nuestra durante, por ejemplo, el Loop de entradas?

Para eso existen las Acciones y los Ganchos, o como se les conoce en el Codex, Actions y Hooks.

Una acción (Action), para WordPress, es una función que se ejecuta en un momento concreto de la aplicación. Este momento lo reconocemos por un identificador, que llamaremos evento o gancho (Hook). Lo usual es decir que enganchamos” una función a una acción, o que relacionamos una función con un evento.

Existe una lista muy amplia de ganchos en WordPress, que podemos consultar en esta página del Codex.

Uso normal de acciones y ganchos

Lo normal es que queramos que, en algún momento, el sistema ejecute una función nuestra. Por ejemplo, que durante la carga inicial de una página se cargue un script.

Primero, debemos saber qué gancho nos hace falta. Mirando un poco la lista nos daremos cuenta de que hay ganchos para todo, y tanto para el front-end como para el panel de admin. En este caso, nos hace falta el gancho “wp_head” (Un apunte: aunque es bastante normal que se use, en realidad este gancho está asociado a una función, get_header, cuyo cometido es incluir el archivo header.php del Theme, y no tiene por qué ser llamada al inicio de una página. Os podéis encontrar con que el desarrollador del Theme decidió no usar get_header, aunque es bastante raro).

Este add_action puede ir antes o después de la función, lo importante es que esté en el plugin, y que sus parámetros sean correctos, primero el gancho, y después el nombre de la función.

De esta forma nos hemos asegurado que, si el Theme usa la función get_header, nuestra funcion “incluir_scripts” será ejecutada entre las etiquetas <head> y </head>.

Prioridades y parámetros

Bien, ¿Y si tengo tres funciones enganchadas a wp_head, pero quiero que sigan un órden concreto? Entonces añadimos un tercer parámetro (opcional) a la función add_action, en este caso un número, que simbolizará la prioridad que tiene esa función a la hora de ejecutarse. Valores más bajos implican que la función será llamada antes. Por defecto, el valor es 10.

Vale profe, otra duda, ¿Y si resulta que la función “incluir_scripts” tiene tres argumentos? ¿Tengo que pasarlos ahora? La respuesta es No. ¿Cómo pretendes pasarlos ahora, si esta función va a llamarse en un momento futuro e indeterminado? Lo que sí tienes que hacer es añadir un último parámetro, también opcional y también numérico, mediante el cual establecemos el número de parámetros que la función acepta. Este valor por defecto es 1.

Creando nuestros propios ganchos

Habitualmente, dejaremos que WordPress llame a nuestras funciones asociandolas a sus ganchos, pero, ¿Podemos crear nosotros nuestros propios ganchos, y permitir que otras funciones se “enganchen” a ellos? Por supuesto que sí.

Para esto existen dos funciones muy parecidas: do_action y apply_filters. La diferencia entre las dos radica en que la segunda, apply_filters, devolverá un resultado aplicado a un valor, y la primera, do_action, no devuelve nada.

do_action

Insisto en que lo normal es que esto lo haga WordPress, pero de acuerdo, supongamos un caso en el que necesitemos usar do_action. La declaración de esta función es la siguiente:

Lo que está entre corchetes [ es opcional ]. Lo que quiero decir es que sólo es obligatorio el nombre del gancho, y después podemos añadir cuantos parámetros más necesitemos. Aquí es donde sí pasamos los parámetros que aceptan las funciones que van a ser llamadas. Por supuesto, el numero de parámetros aceptados debe coincidir con el número de parámetros que estamos pasando.

Voy a intentar explicarlo traduciendo el ejemplo que viene en el Codex.

Creo que con el ejemplo y el juego de palabras de Peter Pan y el Capitán Garfio (Hook, en inglés), ha quedado algo más claro. Hemos creado un gancho propio, “yo_soy_hook”.

apply_filters

La diferencia principal entre apply_filters y do_action es que ahora vamos a usar las funciones “enganchadas” al evento para modificar el valor de una variable. Además, podemos añadir tantos parámetros extra como necesitemos, al igual que en do_action.

¿Para qué puede ser útil esto? Por ejemplo, cuando al final del contenido de una entrada queremos añadir algo.

Como ya he dicho, lo normal es que nosotros usemos add_action para asociar nuestras funciones a eventos durante la ejecución de WordPress, pero no está de más saber que tenemos formas de crear nuestros propios ganchos.

Creo que por hoy es suficiente. Espero que te haya sido útil la explicación. Si tenéis dudas, podéis usar el formulario de comentarios.

Nos vemos en la próxima 🙂

“Todas las piezas deben unirse sin ser forzadas.
Debe recordar que los componentes que está reensamblando
fueron desmontados por usted, por lo que si no puede unirlos
debe existir una razón. Pero sobre todo, no use un martillo”
     .- Manual de mantenimiento de IBM, año 1925