Hooks en WordPress: qué son y cómo funcionan de verdad

febrero 21, 2026 por admin Desarrollo de Plugins
¿Que son los Hooks de Wordpress?

Cuando empecé a desarrollar en WordPress, tardé más de lo que me gustaría admitir en entender realmente cómo funcionan los hooks. Los usaba, sí, pero sin entender por qué. Los copiaba de Stack Overflow y cruzaba los dedos.

Si estás en ese punto, este artículo es para ti. Vamos a desmenuzar el sistema de hooks desde cero, con ejemplos reales y sin saltarnos nada importante.

¿Qué es un hook?

Un hook es un punto de enganche en el código de WordPress. Piénsalo así: cuando WordPress ejecuta una acción, como guardar un post o cargar una página, avisa a todos los que estén «escuchando» ese momento para que puedan ejecutar su propio código.

Es exactamente el patrón de diseño Observer: hay un emisor (WordPress) y hay oyentes (tus funciones). El emisor no sabe quién está escuchando. Los oyentes no modifican el emisor. Todo funciona de forma desacoplada.

Hay dos tipos de hooks:

  • Actions (do_action): WordPress avisa de que algo ha ocurrido. Tú ejecutas código. No devuelves nada.
  • Filters (apply_filters): WordPress te pasa un valor y espera que se lo devuelvas modificado. Siempre debes retornar algo.

Actions — ejecutar código en el momento correcto

Un action hook se dispara cuando WordPress llama a do_action(). Para engancharte a él, usas add_action().

La firma completa de add_action():

add_action( $hook, $callback, $priority, $accepted_args );
  • $hook: nombre del hook al que te enganchas.
  • $callback: función que se ejecuta.
  • $priority: orden de ejecución. Por defecto 10. Menor número = antes.
  • $accepted_args: cuántos argumentos acepta tu función. Por defecto 1.

Ejemplo con prioridad — dos funciones enganchadas al mismo hook:

add_action( 'wp_footer', 'primera_funcion', 5 );
function primera_funcion() {
    echo '<!-- Esto se ejecuta primero -->';
}

add_action( 'wp_footer', 'segunda_funcion', 20 );
function segunda_funcion() {
    echo '<!-- Esto se ejecuta después -->';
}

Los hooks de acción más usados en el desarrollo diario:

  • init — WordPress cargado, antes de enviar cabeceras HTTP. Para registrar CPTs, taxonomías, rewrite rules.
  • wp_enqueue_scripts — Para cargar CSS y JS en el frontend.
  • admin_enqueue_scripts — Para cargar CSS y JS en el admin.
  • wp_head — Dentro del <head>. Para meta tags e inyección de scripts.
  • wp_footer — Antes del cierre de </body>.
  • save_post — Al guardar o actualizar un post.
  • admin_menu — Para registrar páginas en el menú del admin.

Filters — modificar datos antes de que se usen

Un filter hook se dispara cuando WordPress llama a apply_filters(). Para engancharte, usas add_filter(). La diferencia clave con los actions: siempre debes devolver un valor.

add_filter( 'the_title', 'mi_modificar_titulo', 10, 2 );
function mi_modificar_titulo( $title, $post_id ) {
    // Modificamos el título solo en el frontend
    if ( is_admin() ) {
        return $title;
    }
    return '📝 ' . $title;
}

Fíjate en el 10, 2 al final: prioridad 10 y la función acepta 2 argumentos. El segundo argumento ($post_id) solo está disponible si lo declaras.

Si olvidas el return en un filter, el valor que estés filtrando desaparecerá. Este es uno de los errores más comunes en WordPress:

// MAL — devuelve NULL, el título desaparece
add_filter( 'the_title', 'mi_filtro_roto' );
function mi_filtro_roto( $title ) {
    $title = strtoupper( $title );
    // Sin return → WordPress recibe NULL
}

// BIEN
add_filter( 'the_title', 'mi_filtro_correcto' );
function mi_filtro_correcto( $title ) {
    return strtoupper( $title );
}

Crear tus propios hooks

No solo puedes engancharte a los hooks de WordPress — puedes crear los tuyos propios. Esto es especialmente útil cuando desarrollas plugins que otros desarrolladores van a extender.

// Dentro de tu plugin — defines un punto de extensión
function mi_plugin_procesar_datos( $datos ) {

    // Permite a otros plugins modificar los datos antes de procesarlos
    $datos = apply_filters( 'mi_plugin_antes_procesar', $datos );

    // Tu lógica
    $resultado = array_map( 'strtoupper', $datos );

    // Avisa de que el proceso ha terminado
    do_action( 'mi_plugin_despues_procesar', $resultado );

    return $resultado;
}

Ahora cualquier otro plugin puede engancharse a mi_plugin_antes_procesar para modificar los datos antes de que los proceses, o a mi_plugin_despues_procesar para reaccionar cuando hayas terminado.


Eliminar hooks registrados por otros

Puedes eliminar cualquier hook registrado con remove_action() y remove_filter(). Esto es útil para deshabilitar funcionalidades de plugins o del tema sin modificar su código:

// Eliminar el generador de WordPress del head
remove_action( 'wp_head', 'wp_generator' );

// Eliminar el filtro wpautop del contenido
remove_filter( 'the_content', 'wpautop' );

Importante: debes llamar a remove_action() con la misma prioridad con la que fue registrado el hook original. Si no sabes la prioridad, mira el código fuente o prueba con la prioridad por defecto (10).


Conclusión

Los hooks son el sistema que hace que WordPress sea extensible sin tocar el núcleo. Cada vez que modificas un comportamiento de WordPress desde un plugin o un tema, lo estás haciendo a través de hooks. Entenderlos bien no es opcional — es la base de todo lo demás.

El siguiente concepto que deberías dominar después de los hooks es la Settings API, que usa exactamente este sistema para registrar páginas de opciones en el admin.


¿Qué sigue?

  • → Cómo crear una página de ajustes con la Settings API
  • → Cómo registrar un Custom Post Type desde cero
  • → WP_Query explicada con ejemplos reales

Deja un comentario

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