Hooks de WordPress: actions y filters explicados
PHP
1

Por qué existen los hooks

Los hooks son el mecanismo que WordPress usa para dejarte modificar su comportamiento sin tocar el código del core. Gracias a ellos puedes inyectar HTML, interceptar el guardado de un post, cambiar el texto de un correo automático o registrar un nuevo script, todo desde un plugin o desde el functions.php de tu tema. Hay dos tipos: actions y filters.

Actions: ejecutar código en un momento concreto

Una action se dispara cuando WordPress alcanza un punto determinado del flujo de ejecución: cuando se inicializa, cuando guarda un post, cuando envía un correo, etc. Tu función simplemente se engancha con add_action() y hace lo que necesite, sin devolver nada.

add_action( 'wp_enqueue_scripts', 'mi_tema_cargar_assets' );
function mi_tema_cargar_assets() {
    wp_enqueue_style( 'mi-estilo', get_stylesheet_uri() );
    wp_enqueue_script( 'mi-script', get_template_directory_uri() . '/js/app.js', [ 'jquery' ], '1.0', true );
}

Filters: modificar un valor antes de que se use

Un filter recibe un valor, lo puede alterar y debe devolverlo. Si olvidas el return, WordPress se queda sin el dato y puedes romper el sitio.

add_filter( 'the_content', 'mi_tema_agregar_firma' );
function mi_tema_agregar_firma( $contenido ) {
    if ( is_single() ) {
        $contenido .= '

Gracias por leer hasta aquí.

'; } return $contenido; }

La diferencia clave: una action hace algo, un filter transforma algo.

Prioridad y número de argumentos

Tanto add_action como add_filter aceptan dos parámetros extra: la prioridad (por defecto 10, los números menores se ejecutan primero) y el número de argumentos que recibe tu función (por defecto 1).

add_filter( 'the_title', 'mi_tema_prefijo_titulo', 20, 2 );
function mi_tema_prefijo_titulo( $titulo, $post_id ) {
    if ( get_post_type( $post_id ) === 'producto' ) {
        return '[Tienda] ' . $titulo;
    }
    return $titulo;
}

Cuando varios plugins se enganchan al mismo hook, la prioridad decide quién tiene la última palabra.

Ejemplos prácticos

  • Interceptar el guardado de un post con la action save_post para validar campos personalizados.
  • Agregar un aviso al panel usando admin_notices cuando detectes que falta configurar algo.
  • Modificar el asunto del correo de recuperación con el filter retrieve_password_title.
  • Cambiar cuántos posts aparecen en la home filtrando pre_get_posts.

¿Dónde va el código?

Tienes dos opciones sanas. La primera es el functions.php de un child theme, útil para retoques propios de un sitio. La segunda es un plugin personalizado (basta con un archivo PHP con cabecera en wp-content/plugins/mis-hooks/mis-hooks.php), ideal si quieres que el código sobreviva a un cambio de tema. Nunca los pongas en el tema padre: la próxima actualización los borrará.