WordPress Hooks

WordPress Hooks: Actions

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_formusers_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…

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

1 comentario en WordPress Hooks: Actions

  1. Buenas noches.

    Debo enviar un mail de aviso cuando se carga una pagina concreta.

    He hechado mano de la funcion wp_mail() y la asocio a un hook en functions, pero el mail es enviado una y ora vez. Me copa los 100 mails diarios q permite sendgrid.

    He probado el hacer el hook con::
    do_action(wp)
    do_action(wp_head)
    do_action(wp_footer)

    y tambien he probado la funcion mail().

    Y el resultado es el mismo. No doy con la razon x la cual el mail es enviado una y otra vez.

    El sitio esta hecho con divi, pero la pagina donde uso el wp_mail() no la construyo con divi sino q la creo con editor WP puro y simple y edito el html+php en la pestaña html del mismo editor.

    Para envio desde los formularios uso el plugin WP SMTP mail. Los correos q llegan desde los formularios si llegan una sola vez, todo correcto.

    Alguna idea?

Deja un comentario

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

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios