Si estás familiarizado con WordPress, probablemente hayas oído hablar de los hooks (actions y filters), pero… ¿qué son o para qué sirven?
Los hooks de WordPress podrían definirse como ganchos o puntos de acceso en determinadas partes o ubicaciones del proceso de ejecución donde podemos engancharnos con nuestras propias funciones y alterar o modificar el comportamiento por defecto de dicho proceso y/o función, o simplemente modificar alguna variable o dato.
Es decir, nos permiten modificar el código fuente de WordPress o de un Plugin sin realmente modificar el código fuente. Podemos alterar el comportamiento de WordPress o de un plugin sin tocar su core.
En la anterior entrada vimos cómo era el ciclo de carga de WordPress y en que orden se ejecutan esos hooks.
Intervenir a través de los hooks es una buena práctica, ya que nos permitirá seguir actualizando el core de WordPress o los plugins sobre los que hayamos actuado sin perder la funcionalidad extra añadida por nosotros.
Teniendo esto claro, lo siguiente es comentar que en WordPress existen dos tipos de hooks: Actions y Filters. En este primer post vamos a ver que son los Action Hooks y cómo sacarles provecho a través de un ejemplo práctico:
Action Hooks
Un Action Hook es un gancho o un punto de acceso en un lugar concreto dentro de la línea de ejecución o ciclo de carga de WordPress, Plugins o Temas, que nos permite ejecutar nuestras propias funciones y alterar o modificar el comportamiento por defecto.
Para entenderlo de un modo más sencillo: cuando llegues a tal punto, ejecuta lo que yo te diga.
Para esto WordPress nos facilita la función add_action()
add_action( string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1 );
Donde
- $tag (requerido): El nombre del Action donde nos queremos enganchar
- $function_to_add (requerido): Función propia a la que vamos a llamar cuando el proceso de ejecución llegue a ese punto
- $priority (opcional): Prioridad de ejecución respecto a otras funciones que pueden también engancharse al action. El valor por defecto es 10. Valores bajos corresponden a mayor prioridad de ejecución
- $accepted_args (opcional): Número de argumentos que la función acepta
Uno de los actions hooks que más se utilizan probablemente sea wp_head. En el archivo header.php de tu tema de WordPress verás que antes del cierre de la etiqueta </head> se llama a la función wp_head(). Esta función simplemente crea un hook llamado wp_head justo en ese punto de ejecución, es decir, antes de que la carga de la página pase por el cierre de la etiqueta </head>
/**
* Fire the wp_head action.
*
* See {@see 'wp_head'}.
*
* @since 1.2.0
*/
function wp_head() {
/**
* Prints scripts or data in the head tag on the front end.
*
* @since 1.5.0
*/
do_action( 'wp_head' );
}
Como puede observarse, la creación de un hook es mediante la función do_action(), que veremos más adelante en un segundo ejemplo. En este primer ejemplo vamos a ver cómo podemos actuar en ese punto de ejecución.
Imagina que desde el functions.php de tu tema o desde un plugin que estés desarrollando quieres intervenir en el action wp_head para añadir una etiqueta concreta. Bastaría con llamar a la función add_action() de este modo:
<?php
function mi_funcion() {?>
<!-- Tu HTML va aquí -->
<?php }
add_action( 'wp_head', 'mi_funcion', 10 );
Y ahí podríamos escribir etiquetas HTML propias, añadir el script de google analytics, etc…
Creando nuestros propios actions hooks
Imagina que estamos desarrollando un plugin que añade campos personalizados al registro de usuario de WordPress. No voy a entrar en el detalle de la funcionalidad en sí, para ello puedes leer el post que escribí sobre esto.
En nuestro plugin tendremos una función que añadirá campos extras (por ejemplo: poblacion, provincia, teléfono…) al formulario de registro. Imaginad que queremos dejar una puerta abierta para que otro desarrollador que se descargue nuestro plugin pueda actuar en un punto concreto de la ejecución y añadir su propia funcionalidad o adaptarlo a sus necesidades:
<?php
// Agregamos los campos adicionales al formulario de registro
function add_fields_to_users_register_form() {
$user_town = $_POST['user_town'] ?? '';
$user_province = $_POST['user_province'] ?? '';
$user_phone = $_POST['user_phone'] ?? '';?>
<p>
<label for="user_town">Población<br />
<input type="text" id="user_town" name="user_town" class="input" size="25" value="<?php echo esc_attr($user_town);?>"></label>
</p>
<p>
<label for="user_province">Provincia<br />
<input type="text" id="user_province" name="user_province" class="input" size="25" value="<?php echo esc_attr($user_province);?>"></label>
</p>
<p>
<label for="user_phone">Teléfono<br />
<input type="number" id="user_phone" name="user_phone" class="input" size="25" value="<?php echo esc_attr($user_phone);?>"></label>
</p>
<?php do_action('users_register_form');
}
add_action( 'register_form', 'add_fields_to_users_register_form' );
function save_user_fields ( $user_id ) {
if ( isset($_POST['user_town']) ){
update_user_meta($user_id, 'user_town', sanitize_text_field($_POST['user_town']));
}
if ( isset($_POST['user_province']) ){
update_user_meta($user_id, 'user_province', sanitize_text_field($_POST['user_province']));
}
if ( isset($_POST['user_phone']) ){
update_user_meta($user_id, 'user_phone', sanitize_text_field($_POST['user_phone']));
}
do_action('users_register_form_save_data');
}
add_action( 'user_register', 'save_user_fields' );
Hemos añadido dos actions (users_register_form y users_register_form_save_data). De este modo otra persona podrá conectarse en esos puntos de ejecución mediante add_action() y por ejemplo añadir un campo más, avisar por mail a alguien cuando una persona se registra, etc…