# Guía de Optimización Core Web Vitals - Apus Theme
## Tabla de Contenidos
1. [Introducción](#introducción)
2. [Métricas Core Web Vitals](#métricas-core-web-vitals)
3. [Optimizaciones Implementadas](#optimizaciones-implementadas)
4. [Configuración del Servidor](#configuración-del-servidor)
5. [Testing y Medición](#testing-y-medición)
6. [Mejores Prácticas](#mejores-prácticas)
7. [Troubleshooting](#troubleshooting)
---
## Introducción
El tema **Apus Theme** ha sido diseñado desde el inicio con un enfoque en **rendimiento perfecto** y **Core Web Vitals óptimos**. Este documento detalla todas las optimizaciones implementadas y cómo mantener un rendimiento excepcional.
### Objetivos de Rendimiento
- **LCP (Largest Contentful Paint)**: < 2.5 segundos
- **FID/INP (First Input Delay / Interaction to Next Paint)**: < 100ms
- **CLS (Cumulative Layout Shift)**: < 0.1
- **PageSpeed Insights Score**: 90-100 (móvil y desktop)
---
## Métricas Core Web Vitals
### LCP - Largest Contentful Paint
**¿Qué mide?**: Tiempo que tarda en renderizarse el elemento de contenido más grande visible en el viewport.
**Elementos comunes de LCP**:
- Imágenes destacadas (featured images)
- Hero images
- Bloques de texto grandes
- Elementos de video
**Optimizaciones implementadas**:
- ✅ Preload de imágenes críticas (featured images)
- ✅ Lazy loading de imágenes below-the-fold
- ✅ Formato WebP/AVIF para imágenes
- ✅ Responsive images con srcset
- ✅ Preload de fuentes críticas
- ✅ Preload de CSS crítico (Bootstrap, fonts)
- ✅ DNS prefetch y preconnect para recursos externos
- ✅ Eliminación de recursos render-blocking
### FID/INP - First Input Delay / Interaction to Next Paint
**¿Qué mide?**: Tiempo desde que el usuario interactúa con la página hasta que el navegador puede responder.
**Optimizaciones implementadas**:
- ✅ Eliminación de jQuery (JavaScript bloqueante)
- ✅ Scripts con defer strategy
- ✅ Código JavaScript mínimo y optimizado
- ✅ Event delegation para reducir listeners
- ✅ Desactivación del Heartbeat API en frontend
- ✅ Minimización de JavaScript bloqueante
### CLS - Cumulative Layout Shift
**¿Qué mide?**: Cambios de layout inesperados durante la carga de la página.
**Optimizaciones implementadas**:
- ✅ Dimensiones explícitas en todas las imágenes (width/height)
- ✅ Aspect ratio CSS para contenedores de medios
- ✅ Font-display: swap en fuentes locales
- ✅ Espacios reservados para ads (AdSense delay)
- ✅ Sin inyección dinámica de contenido above-the-fold
- ✅ Header sticky sin afectar layout
---
## Optimizaciones Implementadas
### 1. Eliminación de Bloat de WordPress
**Archivo**: `inc/performance.php`
- ❌ Emojis deshabilitados
- ❌ oEmbed deshabilitado
- ❌ Feeds RSS deshabilitados
- ❌ RSD/WLW manifest deshabilitados
- ❌ Dashicons para usuarios no logueados
- ❌ Block Library CSS (Gutenberg)
- ❌ XML-RPC deshabilitado
- ❌ jQuery Migrate removido
- ❌ Admin bar para no-admins deshabilitado
### 2. Resource Hints
**Archivo**: `inc/performance.php`
```php
// DNS Prefetch para recursos externos
- https://cdn.jsdelivr.net (Bootstrap Icons)
- https://www.google-analytics.com
- https://www.googletagmanager.com
- https://pagead2.googlesyndication.com (AdSense)
// Preconnect para recursos críticos
- https://cdn.jsdelivr.net (con crossorigin)
```
### 3. Preload de Recursos Críticos
**Archivo**: `inc/performance.php`
```php
// Fuentes
- inter-var.woff2
- inter-var-italic.woff2
// CSS
- bootstrap.min.css
- fonts.css
// Imágenes (featured images)
- Automático en inc/image-optimization.php
```
### 4. Optimización de JavaScript
**Archivo**: `inc/enqueue-scripts.php`
Todos los scripts utilizan:
```php
array(
'in_footer' => true,
'strategy' => 'defer',
)
```
Scripts incluidos:
- ✅ Bootstrap JS Bundle (defer)
- ✅ Header JS (defer)
- ✅ Main JS (defer)
- ✅ Accessibility JS (defer)
- ✅ AdSense Loader (defer)
- ✅ TOC JS (defer, solo en single posts)
### 5. Optimización de CSS
**Critical CSS**: Disponible pero desactivado por defecto
- Archivo: `inc/critical-css.php`
- Activar en: Customizer > Performance Optimization
- CSS crítico inline por tipo de página
- CSS no crítico cargado asíncronamente
**CSS Loading Order**:
1. Fuentes (fonts.css) - Priority 1
2. Bootstrap CSS - Priority 5
3. Header CSS - Priority 10
4. Custom styles - Priority 11
5. Footer CSS - Priority 12
6. Theme core - Priority 13
7. Utilities - Priority 13
### 6. Optimización de Imágenes
**Archivo**: `inc/image-optimization.php`
Características:
- ✅ Soporte WebP y AVIF
- ✅ Lazy loading nativo (loading="lazy")
- ✅ Dimensiones explícitas (width/height)
- ✅ Srcset responsive automático
- ✅ Sizes attribute optimizado por contexto
- ✅ Fetchpriority="high" en featured images
- ✅ Decoding="async" en todas las imágenes
- ✅ Primera imagen del contenido sin lazy loading (posible LCP)
- ✅ Preload automático de featured images en posts/pages
Tamaños de imagen:
```php
- apus-thumbnail: 400x300
- apus-medium: 800x600
- apus-large: 1200x900
- apus-featured-large: 1200x600
- apus-featured-medium: 800x400
- apus-hero: 1920x800
- apus-card: 600x400
```
### 7. Optimización de Fuentes
**Archivo**: `assets/css/fonts.css`
- ✅ Fuentes locales (no Google Fonts)
- ✅ Format WOFF2 (mejor compresión)
- ✅ Font-display: swap
- ✅ Preload de fuentes críticas
- ✅ Variable fonts (Inter VF)
- ✅ Subset latino solo
### 8. Optimización de Base de Datos
**Archivo**: `inc/performance.php`
- ✅ Límite de posts por página en archives (12)
- ✅ Optimización de WP_Query
- ✅ Self-pingbacks deshabilitados
- ✅ Limpieza periódica de transients expirados
- ✅ Reducción de queries innecesarias
**Recomendación en wp-config.php**:
```php
// Limitar revisiones de posts
define('WP_POST_REVISIONS', 5);
// Aumentar memoria si es necesario
define('WP_MEMORY_LIMIT', '256M');
```
### 9. AdSense Delay Loading
**Archivo**: `inc/adsense-delay.php` y `assets/js/adsense-loader.js`
- ✅ Carga de AdSense solo después de la primera interacción
- ✅ Detecta scroll, click, touch, mousemove
- ✅ Timeout de 5 segundos si no hay interacción
- ✅ Mejora significativa en Core Web Vitals
### 10. Heartbeat API
**Archivo**: `inc/performance.php`
- ✅ Desactivado completamente en frontend
- ✅ Reducido a 60 segundos en admin (default: 15s)
---
## Configuración del Servidor
### Requisitos Mínimos
- PHP 8.0 o superior (recomendado: 8.2+)
- MySQL 5.7+ o MariaDB 10.3+
- Apache 2.4+ o Nginx 1.18+
- Extensión GD o Imagick con soporte WebP/AVIF
### Apache (.htaccess)
```apache
# Compresión Gzip/Brotli
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json
# Browser Caching
ExpiresActive On
# Images
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/avif "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# CSS and JavaScript
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
# Fonts
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/ttf "access plus 1 year"
# Default
ExpiresDefault "access plus 2 days"
# Cache-Control Headers
# Assets inmutables
Header set Cache-Control "public, max-age=31536000, immutable"
# CSS y JS
Header set Cache-Control "public, max-age=2592000"
# MIME Types
AddType image/webp .webp
AddType image/avif .avif
AddType font/woff2 .woff2
```
### Nginx
```nginx
# Compresión Gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json application/javascript;
# Browser Caching
location ~* \.(jpg|jpeg|png|gif|webp|avif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location ~* \.(woff2|woff|ttf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location ~* \.(css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
# MIME Types
types {
image/webp webp;
image/avif avif;
font/woff2 woff2;
}
```
### Plugins Recomendados
**NO instalar plugins de caché pesados** (WP Rocket, W3 Total Cache, etc.)
El tema ya está optimizado. Solo considerar:
- ✅ **Redis Object Cache** o **Memcached** (caché de objetos)
- ✅ **Autoptimize** o **Asset CleanUp** (solo si necesario)
- ❌ **NO usar** plugins de lazy loading (ya implementado)
- ❌ **NO usar** plugins de minificación agresiva
---
## Testing y Medición
### Herramientas
1. **PageSpeed Insights**
- URL: https://pagespeed.web.dev/
- Medir tanto móvil como desktop
- Verificar CrUX (field data) cuando esté disponible
2. **Lighthouse (Chrome DevTools)**
- Chrome DevTools > Lighthouse
- Modo incógnito para evitar extensiones
- Throttling: Mobile/Desktop
- Categorías: Performance, Accessibility, Best Practices, SEO
3. **WebPageTest**
- URL: https://www.webpagetest.org/
- Test desde múltiples ubicaciones
- Configurar conexión 3G/4G
- Film strip view para identificar LCP
4. **Chrome User Experience Report (CrUX)**
- URL: https://developers.google.com/web/tools/chrome-user-experience-report
- Datos reales de usuarios
- Disponible después de suficiente tráfico
### Checklist de Testing
Antes de lanzar a producción:
- [ ] PageSpeed Insights - Móvil: 90+
- [ ] PageSpeed Insights - Desktop: 90+
- [ ] Lighthouse Performance: 100
- [ ] Lighthouse Accessibility: 90+
- [ ] Lighthouse Best Practices: 100
- [ ] Lighthouse SEO: 100
- [ ] LCP < 2.5s (móvil y desktop)
- [ ] FID/INP < 100ms
- [ ] CLS < 0.1
- [ ] Testing en 3G lento
- [ ] Testing en diferentes dispositivos
- [ ] Testing con diferentes tamaños de imagen
- [ ] Testing con AdSense activado
### Métricas a Monitorear
**Semanalmente**:
- Core Web Vitals (LCP, FID/INP, CLS)
- PageSpeed Score
- Tiempo de carga total
- Número de requests HTTP
- Tamaño total de página
**Mensualmente**:
- Auditoría completa con Lighthouse
- Revisión de imágenes no optimizadas
- Limpieza de plugins/código innecesario
- Actualización de dependencias
---
## Mejores Prácticas
### Para Contenido
1. **Imágenes**
- Usar tamaños de imagen apropiados (no subir 5MB)
- Comprimir antes de subir (TinyPNG, ImageOptim)
- Usar formato WebP/AVIF cuando sea posible
- Agregar alt text descriptivo
- Especificar dimensiones siempre
2. **Videos**
- Usar lazy loading (loading="lazy")
- Considerar poster image para videos
- Hostear en YouTube/Vimeo (no subir directo)
- Usar iframe con loading="lazy"
3. **Embeds**
- Minimizar embeds de redes sociales
- Usar lazy loading para iframes
- Considerar screenshots con enlace en lugar de embeds
### Para Desarrollo
1. **CSS**
- No agregar archivos CSS adicionales innecesarios
- Usar clases de Bootstrap cuando sea posible
- Minimizar CSS custom
- No usar !important excesivamente
2. **JavaScript**
- Mantener jQuery deshabilitado
- Usar JavaScript nativo o Bootstrap JS
- Siempre cargar scripts con defer
- Evitar librerías pesadas (moment.js, etc.)
3. **Fuentes**
- No agregar fuentes adicionales
- Usar solo los pesos necesarios
- Mantener fuentes locales (no CDN)
- Usar font-display: swap siempre
4. **Queries**
- Limitar posts_per_page en queries custom
- Usar transients para queries pesadas
- No hacer queries dentro de loops
- Usar índices apropiados en custom tables
### Para Hosting
1. **Servidor**
- PHP 8.2+ con OPcache habilitado
- MySQL 8.0+ o MariaDB 10.6+
- Redis o Memcached para object cache
- HTTP/2 o HTTP/3 habilitado
- CDN configurado (Cloudflare, etc.)
2. **WordPress**
- WordPress 6.4+ (latest)
- Mantener plugins al mínimo
- Usar plugins de calidad solo
- Actualizar regularmente
3. **Base de Datos**
- Optimizar tablas regularmente
- Limitar revisiones de posts
- Limpiar post meta innecesario
- Usar persistent connections
---
## Troubleshooting
### Problema: LCP Alto (> 2.5s)
**Causas comunes**:
- Imagen destacada muy pesada
- CSS render-blocking
- Servidor lento
- Sin preload de recursos críticos
**Soluciones**:
1. Verificar tamaño de imagen destacada (< 200KB)
2. Activar Critical CSS (Customizer > Performance)
3. Verificar que preload de recursos funciona
4. Optimizar servidor/hosting
5. Usar CDN para imágenes
### Problema: FID/INP Alto (> 100ms)
**Causas comunes**:
- JavaScript bloqueante
- Scripts sin defer
- Plugins pesados
- Event listeners excesivos
**Soluciones**:
1. Verificar que jQuery está desactivado
2. Verificar que todos los scripts tienen defer
3. Desactivar plugins innecesarios
4. Revisar custom JavaScript
5. Usar Chrome DevTools Performance tab
### Problema: CLS Alto (> 0.1)
**Causas comunes**:
- Imágenes sin dimensiones
- Ads sin espacios reservados
- Fuentes sin font-display: swap
- Contenido dinámico above-the-fold
**Soluciones**:
1. Verificar que todas las imágenes tienen width/height
2. Activar AdSense delay si usa ads
3. Verificar fuentes locales con swap
4. No inyectar contenido dinámico above-the-fold
5. Usar Chrome DevTools Layout Shift Regions
### Problema: Muchos HTTP Requests
**Causas comunes**:
- Demasiados plugins
- Archivos CSS/JS no combinados
- Imágenes no optimizadas
- External scripts
**Soluciones**:
1. Desactivar plugins innecesarios
2. Combinar archivos cuando sea posible
3. Usar sprites CSS o inline SVG
4. Minimizar external scripts
5. Revisar Network tab en DevTools
### Problema: Tamaño de Página Grande
**Causas comunes**:
- Imágenes no optimizadas
- CSS/JS no minificado
- Demasiado HTML inline
- Recursos no comprimidos
**Soluciones**:
1. Optimizar todas las imágenes
2. Verificar minificación de CSS/JS
3. Reducir HTML inline
4. Habilitar Gzip/Brotli en servidor
5. Usar Coverage tab en DevTools
---
## Recursos Adicionales
### Documentación
- [Web.dev - Core Web Vitals](https://web.dev/vitals/)
- [Google PageSpeed Insights](https://pagespeed.web.dev/)
- [WordPress Performance Team](https://make.wordpress.org/performance/)
### Herramientas
- [PageSpeed Insights](https://pagespeed.web.dev/)
- [WebPageTest](https://www.webpagetest.org/)
- [GTmetrix](https://gtmetrix.com/)
- [Lighthouse](https://developers.google.com/web/tools/lighthouse)
### Optimización de Imágenes
- [TinyPNG](https://tinypng.com/)
- [Squoosh](https://squoosh.app/)
- [ImageOptim](https://imageoptim.com/)
- [AVIF Converter](https://avif.io/)
---
## Changelog
### Versión 1.0.0 - 2025-11-04
- ✅ Optimización completa de Core Web Vitals
- ✅ Resource hints (DNS prefetch, preconnect)
- ✅ Preload de recursos críticos
- ✅ Optimización de imágenes (WebP/AVIF)
- ✅ Lazy loading nativo
- ✅ Critical CSS (opcional)
- ✅ Scripts con defer strategy
- ✅ AdSense delay loading
- ✅ Eliminación de bloat de WordPress
- ✅ Optimización de queries
- ✅ GZIP compression
- ✅ Heartbeat API optimizado
---
## Soporte
Para reportar problemas o sugerir mejoras:
- GitHub Issues: [repositorio del tema]
- Documentación: `wp-content/themes/apus-theme/docs/`
---
**Última actualización**: 2025-11-04
**Versión del tema**: 1.0.0
**Autor**: Apus Theme Development Team