Como precargar recursos con wp_resource_hints desde PHP en WordPress

Este tutorial explica en profundidad cómo precargar y optimizar recursos externos en WordPress utilizando la API de resource hints y la función/filtro wp_resource_hints desde PHP. Se detallan conceptos, ejemplos prácticos listos para usar, soluciones para atributos especiales (como crossorigin), y recomendaciones de rendimiento y comprobación.

Contents

Qué es wp_resource_hints

wp_resource_hints es la API que WordPress expone para incluir resource hints (como dns-prefetch, preconnect, prefetch, preload) en la cabecera HTML. Mediante el filtro wp_resource_hints podemos añadir hosts o URLs que el navegador debería resolver o conectar anticipadamente, disminuyendo latencia en recursos externos críticos.

La interfaz típica para usarla desde un plugin o el functions.php del tema consiste en engancharse al filtro y devolver un array con las URLs a añadir, condicionado por el relation_type que WordPress pregunta.

Relaciones habituales y cuándo usarlas

Relación Propósito
dns-prefetch Resolver DNS de dominios externos antes de necesitarlos (útil para dominios de terceros costosos en DNS).
preconnect Establecer conexión TCP/TLS anticipada (incluye handshake). Muy útil para CDNs y proveedores de fuentes.
prefetch Descargar recursos que muy probablemente se necesiten en una navegación futura (prioridad baja).
preload Priorizar la carga de un recurso crítico para la página actual (requiere atributos adicionales como as= y type=).

Cómo usar wp_resource_hints desde PHP (ejemplos claros)

La forma recomendada es usar el filtro wp_resource_hints y añadir hosts condicionando por el relation_type que se pasa como segundo parámetro. A continuación ejemplos prácticos.

Ejemplo básico: añadir preconnect para Google Fonts

add_filter( wp_resource_hints, mi_tema_resource_hints, 10, 2 )
function mi_tema_resource_hints( hints, relation_type ) {
    if ( preconnect === relation_type ) {
        // Añade el host de las fuentes solo si se va a usar
        hints[] = https://fonts.gstatic.com
        // También puedes incluir la API de Google Fonts
        hints[] = https://fonts.googleapis.com
    }
    return hints
}

Con esto WordPress inyectará en el head los enlaces de rel=preconnect (o la relación que corresponda) para esos hosts.

Ejemplo: añadir dns-prefetch para un CDN

add_filter( wp_resource_hints, mi_tema_dns_prefetch, 10, 2 )
function mi_tema_dns_prefetch( hints, relation_type ) {
    if ( dns-prefetch === relation_type ) {
        hints[] = https://cdn.ejemplo.com
    }
    return hints
}

Condicionar recursos a que estén encolados (control fino)

Es buena práctica sólo añadir hints si el recurso está realmente encolado. Para ello podemos comprobar con wp_style_is() o wp_script_is().

add_filter( wp_resource_hints, mi_tema_conditional_hints, 10, 2 )
function mi_tema_conditional_hints( hints, relation_type ) {
    if ( preconnect === relation_type ) {
        // Solo si la hoja de estilos de fuentes está encolada
        if ( wp_style_is( mi-tema-fonts, enqueued ) ) {
            hints[] = https://fonts.gstatic.com
        }
    }
    return hints
}

// Ejemplo de encolar la hoja de Google Fonts
add_action( wp_enqueue_scripts, function() {
    wp_enqueue_style( mi-tema-fonts, https://fonts.googleapis.com/css2?family=Inter:wght@400700display=swap, array(), null )
})

Preload (recursos críticos) — limitaciones y método recomendado

preload es diferente porque necesita atributos adicionales (as=, type=, y a veces crossorigin). WordPress no proporciona un helper específico para inyectar todos estos atributos desde wp_resource_hints por tanto la opción correcta es imprimir el ltlink rel=preloadgt manualmente en wp_head o usar filtros sobre los tags de encolado.

add_action( wp_head, mi_tema_preload_fonts )
function mi_tema_preload_fonts() {
    // Solo si la fuente local/woff2 se usa en esta página
    if ( ! wp_style_is( mi-tema-fonts, enqueued ) ) {
        return
    }

    // Ruta a la fuente ya subida al servidor o CDN
    url = get_stylesheet_directory_uri() . /fonts/myfont.woff2
    echo 
}

Este enfoque permite añadir todos los atributos necesarios y controlar el momento exacto de la inyección.

Añadir atributos como crossorigin: workaround

Algunas relaciones (p. ej. preconnect a un host de fonts) deben incluir crossorigin para que las fuentes sean reutilizables. Como wp_resource_hints no permite por defecto añadir ese atributo por cada hint, la solución es imprimir manualmente la etiqueta cuando sea necesario:

add_action( wp_head, mi_tema_preconnect_with_crossorigin )
function mi_tema_preconnect_with_crossorigin() {
    // Si hemos encolado Google Fonts
    if ( wp_style_is( mi-tema-fonts, enqueued ) ) {
        echo 
    }
}

De este modo controlas atributos y seguridad por tu cuenta. Evitar duplicar: si usas wp_resource_hints para el mismo host, asegúrate de no inyectarlo dos veces.

Integración con wp_enqueue_scripts

Patrón recomendado: encolar recursos y, en el mismo flujo, añadir hints condicionados.

add_action( wp_enqueue_scripts, mi_tema_enqueue )
function mi_tema_enqueue() {
    wp_enqueue_style( mi-tema-fonts, https://fonts.googleapis.com/css2?family=Inter:wght@400700display=swap, array(), null )
}

add_filter( wp_resource_hints, mi_tema_hints_for_enqueued, 10, 2 )
function mi_tema_hints_for_enqueued( hints, relation_type ) {
    if ( preconnect === relation_type  wp_style_is( mi-tema-fonts, enqueued ) ) {
        hints[] = https://fonts.gstatic.com
    }
    return hints
}

Buenas prácticas y consideraciones de rendimiento

  • Usar hints sólo cuando aportan beneficio real: demasiados preconnect/prefetch son contraproducentes.
  • Condicionar los hints: comprobar si los scripts/estilos están encolados o si la plantilla los necesita.
  • Preload con cuidado: preload incrementa prioridad no use para recursos no críticos o para muchos archivos pequeños.
  • Evitar duplicados: si se inyecta con wp_resource_hints y manualmente, neutralizar duplicados.
  • CORS y fonts: cuando precargues o preconnectes hosts de fuentes, añade crossorigin en la etiqueta preconnect o en el link rel=preload si la fuente es cross-origin.
  • Compatibilidad HTTP/2/3: con HTTP/2 el impacto de múltiples conexiones cambia evalúa con medición real.

Comprobar y depurar

  1. Ver el HTML generado (ver fuente o Inspector) para comprobar los ltlink rel=…gt inyectados.
  2. Usar Chrome DevTools → Network para ver conexiones previas, tiempos y prioridad.
  3. Usar Lighthouse o PageSpeed Insights para comprobar mejoras en LCP y tiempo de carga.
  4. Si un hint no tiene efecto, comprobar que la URL/host coincide exactamente y que no está bloqueado por CSP.

Compatibilidad y seguridad

  • Versión de WordPress: la API de resource hints está disponible desde WordPress 4.6 en adelante.
  • Política de seguridad de contenido (CSP): si usas CSP restrictiva, añade los hosts en las directivas correspondientes (p. ej. font-src, connect-src) para que las conexiones preconectadas o las fuentes puedan usarse.
  • Escapar URLs: usar esc_url() al imprimir URLs para evitar inyección.

Resumen práctico

Usa add_filter(wp_resource_hints, …) para añadir dns-prefetch y preconnect de forma condicionada y ligada a recursos encolados. Para preload y atributos especiales (as=, type=, crossorigin) imprime manualmente la etiqueta en wp_head o modifica el tag producido por el encolador con filtros específicos. Mide siempre con herramientas reales (Lighthouse, DevTools) y evita añadidos innecesarios.



Acepto donaciones de BAT's mediante el navegador Brave 🙂



Deja una respuesta

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