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
- Ver el HTML generado (ver fuente o Inspector) para comprobar los ltlink rel=…gt inyectados.
- Usar Chrome DevTools → Network para ver conexiones previas, tiempos y prioridad.
- Usar Lighthouse o PageSpeed Insights para comprobar mejoras en LCP y tiempo de carga.
- 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 🙂 |
