WordPress Hooks
Esta es una de esas entradas del megatutorial de WordPress desde cero, quizá más avanzada de lo que eran las últimas entradas que he redactado, pero necesario igualmente. Poco a poco va estando completado y da igual el orden que sigamos, lo importante es aprender.
Antes de ponerte a desarrollar plugins, temas e incluso modificar una plantilla, deberías entender los Hooks (o ganchos, aunque nadie los llama así).
¿Qué son los Hooks?
Técnicamente son eventos, por ejemplo invocado por la llamada de do_action() o de apply_filters() que ejecutan después todas las llamadas a las funciones enganchadas a ese evento.
Básicamente, intentando simplificarlo, el proceso sería el siguiente:
- El hook invoca un observador, que se encarga de recoger una serie de funciones «enganchadas» al evento.
- Ejecuta las funciones utilizando call_user_func() de php.
- El código de dichas funciones son implementadas en el proceso del core sin modificarlo.
Lo sé, es una explicación un tanto simplista, pero vamos a ir poco a poco, prefiero que lo entiendas de forma sencilla.
Action Hooks y Filter Hooks
Como los Actions y Filters requieren del uso de Hooks para funcionar, lo más frecuente es que oigas hablar de Action Hooks y Filter Hooks. Y yo, que quiero facilitarte la vida, los llamaré así también (sin traducir) para que puedas buscar más facilmente documentación sobre ellos.
Su implementación es similar pero, como veremos a continuación, sus funciones y aplicaciones son totalmente diferentes.
Los Filter Hooks
Los Filter Hooks están diseñados para modificar contenido. Generalmente se enganchan a hooks de procesamiento de contenido; por ejemplo cuando lo guardamos o cuando lo representamos.
Un ejemplo básico de Filter Hook sería el siguiente, con el que modificamos todos los «wordpress» por «WordPress» en nuestros artículos.
<?php add_filter('the_content', ‘guorpres_vs_wordpress’); function guorpres_vs_wordpress($content) { return str_replace('wordpress', 'WordPress', $content); } ?> |
Atención:
No utilices los filter hooks para realizar shortcodes, para esto existe la función add_shortcode(), cuya utilización es muy sencilla.
Además, los filtros pueden ser reutilizados tantas veces como queramos, podemos utilizarlo múltiples veces y en diferentes tipos de contenido.
Como decía anteriormente, pueden modificar el contenido bien antes de guardarlo en la base de datos o bien más adelante, en la fase de renderizado del contenido.
Pero ojo, cuando hablamos de contenidos no hablamos sólo del contenido de artículos y páginas, sino también de autores, comentarios, widgets, enlaces del blogroll, fechas y horas, elementos del escritorio, etc. Todo de forma dinámica sin tocar el código del núcleo de WordPress.
Cómo crear Filter Hooks
Si quieres añadir un filter Hook tendremos que utilizar la función add_filter().
<?php add_filter( $tag, $function, $priority, $accepted_args ); ?> |
Su uso es sencillo:
- Tag: (string) A qué tipo de proceso de contenido debe ser aplicado el filtro
- Function: (callback) La función a ejecutar.
- Priority: (int) – opcional. Orden en el que debe ser ejecutado. A número más bajo antes se ejecutará. Por defecto 10.
- Accepted Args: (int) – opcional Número de argumentos aceptados cuando utilizamos apply_filters() (WP >= 1.5.1). Por defecto 1.
Mi consejo es que os centréis en los dos primeros parámetros, la prioridad dependerá de otros factores.
A tener en cuenta, que la función será la que marque nuestro control sobre el contenido.
Los Action Hooks
Aunque similares en implementación, son completamente diferentes en funcionamiento.
Mientras que los Filter Hooks están enfocados a modificar y actualizar contenidos, los Action Hooks están diseñados para proporcionar una mayor flexibilidad en cómo se procesan los elementos, así como la posibilidad de añadir nuevas funciones al sistema (campos de texto, hojas de estilo, otros tipos de contenido, Custom Post Types, Metaboxes…).
Todo, como siempre, sin alterar el código original del core de WordPress.
Empecemos con un ejemplo:
<?php add_action(‘admin_menu', ‘mi_plugin_extraordinario’); function mi_plugin_extraordinario() { if(function_exists('add_submenu_page')) { add_submenu_page(‘plugins.php','Extraordinario', ‘Extraordinario’, 10, ‘my_new_plugin', 'my_new_plugin_admin_page_function'); } } ?> |
Digamos que todo Action Hook se ejecuta en tres fases (según el ejemplo anterior, obtendríamos):
- El Action: Obtiene el menú de administración.
- La petición: Cuando estés generando el Menú de administración, ejecuta esta función que añade un elemento bajo la sección de plugins.
- El Resultado: El menú es generado con nuestro enlace, justo debajo de la sección de plugins.
Cómo crear Action Hooks
Al igual que con los filter hooks tenemos una función que se encarga de esto, ¿Adivinas cuál es? En efecto, add_action().
<?php add_action($tag, $function, [$priority], [$accepted_args]); ?> |
Y, una vez más, los parámetros:
- Tag: (string) A qué tipo de proceso de contenido debe ser aplicado el filtro
- Function: (callback) La función a ejecutar.
- Priority: (int) – opcional Orden en el que debe ser ejecutado. A número más bajo antes se ejecutará. Por defecto 10.
- Accepted Args: (int) – opcional Número de argumentos aceptados cuando utilizamos apply_filters() (WP >= 1.5.1). Por defecto 1.
Al igual que en los Filter Hooks, lo mejor es que te centres en las dos primeras. Ten en cuenta, de nuevo, que la función es la que marca el control sobre el hook. Vamos, que es con la que controlamos lo que queremos hacer.
Uso de Hooks de forma avanzada (Advance Hooking)
Además, podemos tener control sobre los hooks, conociendo y preguntando a WordPress en todo momento sobre su uso e implementación.
Para ello tenemos estas funciones:
- has_action y has_filter: Detectan cuándo (o cuándo no) se ha añadido una función al array de hooks para un evento determinado.
- did_action y did_filter: Detectan cuándo (o cuándo no) se ha invocado un evento. Cuidado, porque si tu evento no ha sido enganchado al hook pero se ha invocado, retornará true.
- remove_action y remove_filter: Nos permiten eliminar una función específica de un evento determinado.
- remove_all_actions y remove_all_filters: También podemos eliminar todas las funciones de un evento determinado. Con remove_all_actions(«the_content», 4) eliminamos todas las funciones enganchadas al hook «the_content» con prioridad 4.
- current_filter(): Sólo aplicable a los filtros; nos permite saber si el evento actual ha sido procesado.
Como ves, no profundizo en exceso en estas funciones, ya que tienes toda la información sobre ellas en el Codex y, realmente su explicación no es el propósito de esta entrada.
También puedes añadir tus propios Hooks en tu tema (funcions.php) o tu plugin, pero como da para otra entrada… Te lo explicaré más adelante.