X

¿Qué son los Hooks de WordPress y Cómo usarlos?

Cuando empecé con WordPress, buscaba formas de hacer cambios por programación y encontré el concepto de Hooks. Al inicio hablar de Hooks te puede parecer un poco complejo, sin embargo luego de familiarizarte con este término verás que usarlos te resultará más fácil de lo que piensas.

 

1- ¿Qué son los Hooks de WordPress?

¿Te imaginas que puedas hacer cambios en la funcionalidad de WordPress sin modificar sus archivos fuente?, pues eso es precisamente los que nos permiten los Hooks. La palabra Hook se puede traducir como gancho, la idea es «enganchar nuestro código adicional» en los ganchos que están disponibles a lo largo de todo el código WordPress, y evitar hacer modificaciones a sus archivos directamente.

 
Usar tu código adicional a través de Hooks te permite conservar las modificaciones que realices luego de una actualización de WordPress

La estructura de Hooks no es exclusiva sólo del core de WordPress es aplicable también a plugins externos

 

2- Tipos de Hooks

Existen dos tipos de Hooks, las acciones y los filtros, ambos son muy parecidos en su estructura y forma de usarlos, sin embargo difieren en el valor que retornan.
 

Internamente, a nivel de WordPress, una acción y un filtro son tratados de manera similar, es decir una acción es un filtro con parámetros por defecto

 

2.1 – Action Hooks

Las acciones te permiten agregar funcionalidad, ejecutando tus propias funciones en un determinado punto, por ejemplo llegado a un punto:
 

  • Insertar scripts
  • Mostrar un formulario
  • Validar un usuario
  • Imprimir un mensaje, etc

 
Como ves, si encuentras un punto en donde puedas trabajar con un Action Hook, no estas restringido a devolver algún tipo de valor particular.

 
En los archivos de WordPress para localizar en donde puedes insertar un Action Hook debes buscar la función do_action(), luego, puedes hacer referencia a tu código a través de una función llamada add_action, tal como se ve en la siguiente imagen:

 

Sintaxis de add_action


add_action( string $hook, callable $tu_funcion, int $prioridad = 10, int $args = 1 )

Como ves, los parámetros requeridos son los dos primeros, el nombre del hook y el nombre de tu función, los otros dos parámetros son opcionales, indican la prioridad de ejecución y la cantidad de argumentos pasados a la función. Para más información puedes revisar la documentación oficial de add_action.
 

2.2- Filter Hooks

Los filtros, al igual que las acciones, nos permiten ejecutar una función personalizada en un determinado punto, sin embargo la función que usemos tendrá un parámetro de entrada, dentro de nuestra función haremos modificaciones al parámetro y finalmente volveremos a retornar el parámetro.

 
Algunos valores devueltos por los filtros son por ejemplo:

  • Cadenas de texto
  • Arrays

 

En los archivos de WordPress para localizar en donde puedes insertar un Filter Hook debes buscar la función apply_filters(), luego, puedes hacer referencia a tu código a través de una función llamada add_filter, tal como se ve en la siguiente imagen:

 

Sintaxis de add_filter


add_filter( string $hook, callable $tu_funcion, int $prioridad = 10, int $args = 1 )

Al igual que una acción, en el caso de un filtro los parámetros requeridos son los dos primeros, el nombre del hook y el nombre de tu función, los otros dos parámetros son opcionales.

Para usar un filtro, al construir tu función, tendrás al menos un parámetro de entrada por defecto, el cual deberás devolverlo luego de modificarlo. Para más información puedes revisar la documentación oficial de add_filter.

 

3- Usando Hooks

En el siguiente ejemplo aprenderás cómo reemplazar el título de una entrada, lo podrás hacer usando tanto acciones como filtros.

El código que se usa para modificar los Hooks puedes colocarlo en el archivo functions.php de tu theme o si estas construyendo un plugin como parte de los archivos del plugin.

Usando Acciones


add_action( 'the_post', 'dcms_cambiar_objeto_post' );

function dcms_cambiar_objeto_post( $post_object ) {
	// print_r($post_object);
	$post_object->post_title = str_replace('Hola', 'Hi', $post_object->post_title);
}

En el código anterior:

  • Usamos el Action Hook the_post que hace referencia a la función dcms_cambiar_objeto_post
  • La función dcms_cambiar_objeto_post por defecto tiene un parámetro que es el objeto post
  • Podemos ver toda lo que contiene el objeto con la función print_r
  • En el ejemplo estamos cambiando el título, si encuentra el texto «Hola» lo cambia por «Hi»
  • No necesitamos retornar ningún valor porque el objeto se pasa por referencia

 

Usando Filtros


add_filter( 'the_title', 'dcms_filtro_titulo' );

function dcms_filtro_titulo( $titulo ) {
    $titulo = str_replace('Hola', 'Hi', $titulo);
    return $titulo;
}

En el código anterior:

  • Usamos el Filter Hook the_title que hace referencia a la función dcms_filtro_titulo
  • La función acepta el texto del título como parámetro por defecto
  • Cambiamos la variable $titulo, si encuentra el texto «Hola» lo cambia por «Hi»
  • Finalmente es necesario retornar el valor de la variable $titulo

 

En nuestro ejemplo pudimos hacer la misma modificación tanto con acciones como con filtros, sin embargo no es lo más común. Usualmente las acciones están reservadas para cambiar funcionalidad diferente a los filtros

 

4- ¿Cómo localizar Hooks?

Una forma para localizar los Hooks que quieres modificar es navegando en el código fuente de WordPress, sin embargo otra opción es usar un sitio web como Hookr que te ofrece un índice de los hooks disponibles de acuerdo a la funcionalidad.

 

Hookr.io cuenta incluso con un plugin para facilitar la localización de algunos Hooks cuando cargas tu sitio.

Otras referencias similares a tener en cuenta

 

Para ver otros ejemplos te sugiero revisar el punto #2 del curso de WordPress Avanzado

 

Categorías: Core
Etiquetas: funcionalidad

Ver comentarios (18)

  • Hola! Cómo puedo modificar el título de mi página web de Wordpress utilizando código ya que desde "Apariencia" -> "Personalizar" no me permite modificar el título para que en vez de por ejemplo sea así: "ESTE ES MI SITIO", Aparezca esto: "Este es mi Sitio". Uso el tema Twenty Seventeen de Wordpress.org. Muchas gracias de antemano! Excelentes tutoriales!!

  • Hola Buenas tardes
    Tengo en mi escritorio unos archivos que necesito subir a WordPress, estos archivos están en php, si los subo como lo explicas, estos al momento de ir a la pagina que darian con toda la información?

    • Dudo que funcionen, si tus archivos hacen algo podrías ponerlos en alguna ruta y usar un iframe para mostrarlo en tu sitio.

  • Hola, Jhon. Espero me puedas ayudar en esto.
    ¿Que hooks podría usar para ocultar el contador inventario de un producto al publico en woocommerce, pero manteniendo mi inventario interno en el sistema?.
    Gracias.

  • Hola buenas tardes

    Un producto de nuestra tienda cuenta con 3 variaciones:
    la primera variación descontaría 1 pieza del inventario.
    la segunda variación descontaría 3 piezas del inventario.
    La tercera variación descontaria 5 piezas del inventario.

    Podrías orientarme en como realizar el hook para hacer esta acción?

    • Hola, no entiendo esto que comentas con los Hooks, salvo que tu mismo lo estes programando por código.

  • Hola Jhon gracias por tu informacion.

    Si quiero obtener información de otro servidor (Azuracast) para ingresar la data a mi web y comparar versus una base de datos (la cual se alimenta de formularios en mi web) para votar ciertas variables de acuerdo a eso, me gustaria ver mas detalles de este trabajo. Te podría contactar? Gracias

  • Hola muy bueno como explicas, me encanto, te hago una consulta, yo quiero modificar mi plugins learn Press para que en vez de mostrarme en el examen una pregunta me muestre las 100 que tengo en mi academia, me podrías indicar que tutorial de esto es recomendable?¿Lo hago sobre el plugin y también sobre el tema? Gracias

  • Hola, espero me puedas ayudar, leo frecuentemente tus posts... como puedo incluir documentos de una libreria de php en este caso spreadphp que es para leer un documento .xlsx dentro de mi panel de administracion en un plugin que estoy desarrollando, he intentado con "include" mas la direccion de donde se encuentran los archivos pero me manda un error, me dice que tego que usar un do_action, podrias orientarme?

    • Hola, el do_action es para ejecutar hooks, pero entiendo que en tu caso quieres hacer referencias a clases, tendrías que detectar cual es la clase principal de tu librería y luego instanciarla, lo usual es usar composer de PHP para incluír librerías en tu plugin, espero hacer un artículo en un futuro para esto.

  • Hola Jhon, tengo un campo de un formulario woocommerce llamado Destino, que ahora el usuario debe completar y en dependencia de este valor, se muestra una lista de hoteles. Queremos que ese campo destino se llene de manera automática con la categoría del producto He pensado usar una variable global generada con plugin, con el valor del destino, pero no se como asignarle el valor? y despues cómo asignarle ese valor al campo Destino. Muchas gracias.