Optimización del Rendimiento: Lazy-Load Slideout para Jerarquías de Categorías Grandes
Cuando tienes una categoría padre con:
- Gran número de productos (500-1000+)
- Jerarquía de categorías profundas (múltiples niveles de subcategorías)
- Dynamic Recount enabled
El filtro de productos podría generar cientos de consultas SQL en cada carga de página, incluso si el usuario nunca usa el filtro. Esto causa:
- Carga lenta de página (más de 10 segundos)
- Errores 504 Gateway Timeout
- Alta carga del servidor
- Mala experiencia de usuario
Por qué sucede esto
Con el Recuento Dinámico habilitado, WOOF debe:
- Procesa recursivamente todas las subcategorías
- Ejecutar consultas SQL para cada término para contar productos
- Calcular recuentos considerando el contexto de la categoría actual
Ejemplo: Una categoría “Gafas de sol” con subcategorías (Hombres → Mujeres → Formas → Marcas) genera una carga masiva de consultas.
Soluciones Tradicionales (Insuficientes)
❌ Ocultar el slideout con CSS/reglas de visualización – El filtro todavía se procesa en el servidor
❌ Desactivar Recuento Dinámico – Pierde funcionalidad importante
❌ Eliminación de opciones de filtro – Los usuarios no pueden filtrar correctamente
❌ Índices de base de datos – Mejora menor, no resuelve la causa raíz
La Solución Óptima: Slideout Lazy-Load
Concepto clave: Carga el filtro SÓLO cuando el usuario abre realmente el slideout.
✅ La página se carga instantáneamente (sin procesamiento del filtro)
✅ El filtro funciona perfectamente cuando es necesario
✅ No se desperdician recursos del servidor
✅ Perfecto para bots y navegadores casuales
✅ Mantiene intacta toda la funcionalidad del filtro
Implementación
Añade el siguiente código a tu tema’s functions.php:
/**
* WOOF Lazy-Load Slideout Filter
* Loads filter only when user clicks to open slideout
* Solves performance issues with deep category hierarchies
*/
add_action('wp_footer', function () {
// Only on product category pages (optional - remove condition to show everywhere)
if (!is_product_category()) {
//return;
}
?>
<!-- Slideout Trigger Button -->
<div id="woof-slideout-trigger" style="position: fixed; right: 0; top: 50%; transform: translateY(-50%); z-index: 9999; cursor: pointer; background: #333; color: #fff; padding: 15px 10px; border-radius: 5px 0 0 5px; font-weight: bold; writing-mode: vertical-rl; text-orientation: mixed;">
FILTERS
</div>
<!-- Slideout Panel -->
<div id="woof-slideout-panel" style="position: fixed; right: -350px; top: 0; width: 350px; height: 100%; background: #fff; box-shadow: -2px 0 10px rgba(0,0,0,0.3); z-index: 9998; transition: right 0.3s ease; overflow-y: auto; padding: 20px;">
<!-- Close Button -->
<div style="text-align: right; margin-bottom: 15px;">
<span id="woof-slideout-close" style="cursor: pointer; font-size: 24px; font-weight: bold;">✖</span>
</div>
<!-- WOOF Filter with autohide - loads only on first click -->
<?php echo do_shortcode('[woof autohide=0 start_filtering_btn=1]'); ?>
</div>
<!-- Background Overlay -->
<div id="woof-slideout-overlay" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 9997; display: none;"></div>
<script>
jQuery(document).ready(function ($) {
var $trigger = $('#woof-slideout-trigger');
var $panel = $('#woof-slideout-panel');
var $overlay = $('#woof-slideout-overlay');
var $close = $('#woof-slideout-close');
var filterLoaded = false;
// Open slideout
$trigger.on('click', function () {
$panel.css('right', '0');
$overlay.fadeIn(300);
// Auto-trigger WOOF "Start Filtering" button on first open
if (!filterLoaded) {
setTimeout(function () {
var $woofBtn = $('.woof_start_filtering_btn');
if ($woofBtn.length) {
$woofBtn.trigger('click');
// Hide the button after triggering
$woofBtn.hide();
filterLoaded = true;
}
}, 500);
}
});
// Close slideout
function closeSlideout() {
$panel.css('right', '-350px');
$overlay.fadeOut(300);
}
$close.on('click', closeSlideout);
$overlay.on('click', closeSlideout);
});
</script>
<?php
}, 999);
Pasos de configuración
- Desactiva tu deslizador actual en la configuración de WOOF si está habilitado
- Agrega el código anterior a
functions.phpde tu tema activo - Mantenga habilitada esta configuración de WOOF:
- Caché de recuento dinámico: Sí
- Caché de términos: Sí
- Ocultar términos vacíos: Sí
- Recuento Dinámico: Sí
- Personalización opcional:
- Ajusta el ancho del slideout: cambia
width: 350pxyright: -350px - Cambiar posición del botón: modificar
top: 50% - Personalizar colores: actualizar
backgroundycolorvalores - Haz que funcione en todo el sitio: elimina el
if (!is_product_category())condición
- Ajusta el ancho del slideout: cambia
Cómo Funciona
- Cargas de página: Solo se renderiza el botón de activación (no hay procesamiento de filtros)
- El usuario hace clic en el botón: Se abre el Slideout, aparece el overlay
- Primero abre solo: JavaScript hace clic automáticamente en el botón oculto "Iniciar Filtrado"
- Carga del filtro: WOOF procesa todas las consultas y muestra las opciones de filtro
- Aperturas subsiguientes: El filtro ya está cargado, se abre instantáneamente
Resultados del mundo real
Antes:
- Carga de página: 10-15 segundos (o tiempo de espera de 504)
- 500+ consultas SQL por visita a la página
- Alta tasa de rebote
Después:
- Carga de página: < 2 segundos
- El filtro se carga en ~3 segundos (solo cuando se solicita)
- ~50% de reducción en la carga del servidor (muchos usuarios nunca abren el filtro)
Compatibilidad
✅ Funciona con todas las versiones de WOOF
✅ Compatible con caché de página (WP Rocket, LiteSpeed, etc.)
✅ Optimizado para móviles
✅ Funciona con cualquier tema de WordPress
Personalización Avanzada
Coincide con el estilo de tu tema:
/* Add to your theme's CSS */
#woof-slideout-trigger {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
font-family: 'Your Theme Font', sans-serif;
letter-spacing: 2px;
}
#woof-slideout-panel {
background: #f8f9fa;
font-family: 'Your Theme Font', sans-serif;
}
#woof-slideout-trigger:hover {
transform: translateY(-50%) scale(1.05);
}
Deslizante lateral:
Cambia estos valores:
right: -350px → left: -350px
right: 0 → left: 0
right: -350px → left: -350px
Cuándo usar esta solución
Usa el slideout de carga diferida cuando:
- La categoría tiene una jerarquía profunda (3+ niveles)
- más de 500 productos en la categoría
- Recuento dinámico requerido
- Tiempo de carga de página > 5 segundos
- Experimentando tiempos de espera 504
Alternativa para el Filtro de Barra Lateral
Si prefieres una barra lateral en lugar de un deslizamiento, usa:
echo do_shortcode('[woof autohide=1 start_filtering_btn=1]');
Esto crea un botón "Iniciar Filtrado" en tu barra lateral que carga el filtro al hacer clic.
Esta solución proporciona el mejor equilibrio entre rendimiento y funcionalidad, asegurando cargas rápidas de página mientras se mantienen las capacidades de filtrado completas para los usuarios que las necesitan.