Informes pendientes, errores confirmados, estado de correcciones y entradas resueltas
Problemas conocidos de módulos PrestaShop
Revise informes pendientes, errores confirmados, notas de compatibilidad, estado de correcciones y problemas resueltos antes de actualizar un módulo o abrir un ticket de soporte.
Los informes permanecen visibles durante la revisión
Una entrada pública suele comenzar con un ticket de soporte, una prueba de compatibilidad o un informe de cliente. Los informes públicos nuevos aparecen primero como pendientes; después de la revisión confirmamos el comportamiento, actualizamos el módulo afectado cuando hace falta una corrección y cambiamos el estado.
Las entradas abiertas muestran qué vigilar antes de actualizar
Use esta página antes de instalar una actualización, probar un módulo en una nueva versión de PrestaShop o decidir si hace falta un ticket de soporte. Los problemas abiertos explican qué sigue en revisión o corrección, mientras la búsqueda y los filtros de estado le ayudan a acotar la lista rápidamente.
Los problemas resueltos siguen visibles
Las entradas corregidas no se ocultan después de la publicación. Mantenerlas visibles facilita entender el historial del módulo: puede ver qué se informó, qué módulo estuvo afectado y cuándo se gestionó el problema.
Qué está pasando ahora
Un vistazo rápido a informes pendientes, problemas abiertos y correcciones recientes. Use el seguimiento completo de abajo para buscar por módulo, filtrar por estado u ordenar toda la lista.
Pendiente de revisión
No hay informes públicos pendientes de revisión.
Elementos abiertos a vigilar
Resueltos recientemente
- Una instalación nueva creaba variables que describían nuestro propio catálogo Content Variables
- El back office sugería un marcador de ejemplo que no existía tras la instalación Content Variables
- La insignia con el contador de la lista de deseos muestra un número desactualizado tras eliminar artículos Smart Wishlist
- El desplegable de moneda se cierra inmediatamente al tocarlo en Safari de iOS Currency Selector
Todos los problemas seguidos
Busque por módulo o detalles del problema, filtre por estado y ordene por fecha de actualización o número de informes.
La instalación de 1.0.0 creaba tres variables nombradas según el catálogo de mypresta.rocks: un recuento de módulos, de servicios y de packs. Una tienda que vende otra cosa abría la pantalla Content Variables y encontraba tres entradas sin condiciones y sin significado para su catálogo.
La indicación de la pantalla Content Variables recomendaba escribir un marcador para un recuento de módulos. Tras corregir las variables predeterminadas esa clave ya no existe en una tienda nueva, así que el ejemplo no apuntaba a nada y el primer intento devolvía un resultado vacío.
Eliminar un producto de la lista de deseos vía AJAX actualiza la lista, pero la insignia del icono de la lista de deseos en la cabecera sigue mostrando el contador antiguo hasta recargar la página.
En Safari de iOS, el desplegable se abre y se cierra inmediatamente porque la propagación del evento touchstart se gestiona de forma diferente, activando el manejador de clic exterior.
Tanto obtp.js de Outbrain como el gestor de etiquetas de Matomo modifican la propiedad document.referrer, haciendo que el script cargado más tarde lea un valor de referente incorrecto.
Cuando el servicio VIES de la UE está lento o caído, la petición de validación del IVA se bloquea durante 30 segundos antes de expirar, congelando el paso del checkout.
Las tiendas detrás de Cloudflare banean las direcciones IP de los proxies de Cloudflare en lugar de la IP real del visitante, pudiendo bloquear a miles de visitantes legítimos del mismo servidor edge.
El generador del sitemap se ejecuta como un único proceso y alcanza los límites de memoria de PHP en catálogos grandes con muchas combinaciones e imágenes.
Los clientes de empresa que compran como invitados no ven la opción de pago aplazado aunque su número de IVA cumpla los criterios B2B, porque el módulo comprueba la pertenencia a un grupo de clientes, lo que requiere una cuenta.
Extensiones de navegador como uBlock Origin bloquean el patrón de URL estándar del script de seguimiento de Matomo (/matomo.js), impidiendo la recopilación de analíticas para el 25-40% de los visitantes.
Cuando el cliente vuelve a la página de confirmación antes de que se dispare el webhook de Stripe, el pedido se valida dos veces. La segunda validación (webhook) lanza una excepción porque la transición de estado del pedido no es válida.
Los productos con descripciones largas reciben un número excesivo de enlaces inyectados (a veces 15+), lo que los motores de búsqueda pueden interpretar como spam de enlaces.
Con 3 o más productos seleccionados, la tabla de comparación desborda el viewport en móvil sin ningún indicador de desplazamiento horizontal, ocultando los productos situados más a la derecha.
El snippet de JavaScript de Olark usa construcciones tipo eval que son bloqueadas por las cabeceras CSP, impidiendo que el widget de chat se cargue.
El script de seguimiento se carga en las páginas del back office mediante displayBackOfficeHeader, grabando la actividad de los administradores junto a las sesiones de los clientes. Esto expone datos sensibles de administración en las grabaciones de Clarity.
Las categorías vacías (usadas como landing pages informativas) no renderizan el segundo bloque de descripción porque la plantilla comprueba el número de productos antes de mostrar cualquier contenido de la categoría.
El precio del Offer JSON-LD usa el precio base de catálogo en lugar del precio tras aplicar precios específicos, reglas de impuestos o descuentos de grupo.
Tanto el Insight Tag del lado del navegador como la Conversions API del lado del servidor disparan el mismo evento de conversión sin clave de deduplicación, lo que hace que LinkedIn Campaign Manager cuente las conversiones por duplicado.
El botón de volver arriba es visible incluso en páginas más cortas que la altura del viewport, donde no es posible desplazarse. Esto añade ruido visual innecesario.
El token de acceso a la página de larga duración caduca a los 60 días sin ninguna advertencia en el panel del módulo. El feed deja de actualizarse y muestra contenido obsoleto.
La función de grabación de Smartsupp captura las pulsaciones de teclas en los campos del formulario de pago, pudiendo registrar datos sensibles de la tarjeta en las repeticiones de sesión.
El correo reenviado regenera el resumen del pedido con los precios actuales del catálogo, que pueden diferir de los precios en el momento del pedido si estos se han modificado.
Los códigos de respaldo de 2FA se muestran únicamente durante la configuración. Si el administrador los pierde junto con su dispositivo autenticador, queda bloqueado de forma permanente.
La función de reproducción de sesiones captura los campos de contraseña en el checkout, mostrando caracteres enmascarados que potencialmente podrían correlacionarse con las pulsaciones de teclas.
Cuando un visitante envía cualquier formulario del sitio que contenga su correo electrónico, HubSpot asocia retroactivamente todo su historial de navegación anónimo previo con esa dirección de correo, lo que puede infringir el RGPD.
Las facturas en divisas que usan la coma como separador decimal (EUR en algunas configuraciones regionales) se exportan con puntos, provocando errores de importación en el software de contabilidad local.
El módulo aplica lazy loading a todas las imágenes, incluida la primera imagen de producto que aparece en el viewport al cargar la página, causando un desplazamiento visible del layout.
La capa de datos pasa los precios de los productos como '€29.99' (con símbolo de moneda) en lugar de '29.99' (solo numérico). El sistema de AdRoll no puede analizar el valor y descarta los datos de ingresos.
El carrusel de desplazamiento automático sigue moviendo los logotipos incluso cuando el usuario pasa el cursor para leer el nombre de un cliente o hacer clic en un enlace, haciendo que la interacción sea frustrante.
Las animaciones CSS transform en múltiples elementos activan la promoción a capas del compositor, agotando la memoria GPU en móviles de gama baja y provocando pérdidas de fotogramas visibles.
El evento de conversión envía el total del pedido en la divisa por defecto de la tienda en lugar de la divisa seleccionada por el cliente, causando discrepancias de ingresos en los informes de Bing Ads.
Android 13 exige que las aplicaciones declaren con qué otras aplicaciones pueden interactuar. El enlace de intent viber:// falla silenciosamente en las versiones más recientes de Android.
Los productos sin reseñas siguen generando un bloque AggregateRating de schema.org con ratingCount=0. Google Search Console lo reporta como un error de datos estructurados.
Si un producto se llama 'Blue Running Shoes' en la categoría 'Running Shoes', el patrón {product} - {category} produce 'Blue Running Shoes - Running Shoes', que los motores de búsqueda marcan como keyword stuffing.
Los importes de pedido con coma decimal (formato europeo, p. ej. 99,99) rompen el parámetro de la URL de postback S2S, haciendo que Taboola rechace la conversión.
El evento fbq('track', 'Purchase') siempre envía la moneda predeterminada de la tienda (EUR), incluso cuando el cliente pagó en GBP, lo que provoca discrepancias de ingresos en Facebook Ads Manager.
Si la visibilidad del tablero de Pinterest está configurada como 'Secret', el widget de incrustación muestra un estado vacío aunque el tablero tenga pines. No se muestra ningún error.
La solicitud de cuenta profesional acepta cualquier texto en el campo del número de IVA sin validar el formato contra el patrón de IVA del país seleccionado.
Los eventos de GA4 add_shipping_info y add_payment_info dependen de un MutationObserver que vigila la clase CSS .-current en los elementos de paso del checkout nativo de PrestaShop. Los módulos de checkout de una página, los temas de checkout personalizados o los módulos que usan otros indicadores de paso no dispararán estos dos eventos específicos.
Todos los demás eventos de seguimiento (begin_checkout, purchase, vistas de página, añadir al carrito) funcionan independientemente del módulo de checkout en uso — solo se ven afectados los eventos de los pasos intermedios del checkout.
PrestaShop 1.6 no tiene el hook displayAfterBodyOpeningTag, por lo que los fallbacks noscript para GTM, Meta Pixel y Pinterest Tag no se inyectan. Esto solo afecta a usuarios con JavaScript completamente desactivado, lo cual es extremadamente raro.
Impacto: Mínimo. Los visitantes sin JavaScript no son rastreados por ningún píxel, independientemente de las etiquetas noscript. Los fallbacks noscript sirven principalmente como señales de verificación para las plataformas.
Cuando el reenvío de compras perdidas se dispara mediante cron, genera un pseudo client ID (dígitos aleatorios + marca de tiempo) porque la cookie _ga del navegador original no está disponible. Por ello, las compras reenviadas aparecen como sesiones/usuarios separados en los informes de GA4.
Solución alternativa: Activar el seguimiento User-ID en la configuración de la plataforma GA4. Si el cliente estaba conectado durante la compra, el User-ID vinculará el evento del servidor con su perfil de usuario existente.
La especificación OneTag de Criteo limita los eventos viewList a un máximo de 3 IDs de producto. Las páginas de categoría con más productos solo envían los 3 primeros IDs. Es una limitación de la plataforma Criteo, no un bug del módulo.
La API del píxel de Quora no acepta parámetros de ingresos en la llamada estándar track('Purchase'). El evento de compra se dispara correctamente pero sin el valor de la transacción. Es una limitación de la API de tracking de Quora.
Una tarea cron que falla (p. ej., timeout, error de memoria) se reintenta inmediatamente en el siguiente intervalo del cron, pudiendo causar miles de ejecuciones fallidas por hora.
Los cambios de estado a través de la API WebService disparan tanto el hook de la API como el hook del panel de administración, haciendo que las acciones automatizadas (correos, actualizaciones de stock) se ejecuten dos veces.
El código introducido en el editor del bloque HTML se sanea al guardar, eliminando todas las etiquetas . Esto impide casos de uso legítimos como incrustar widgets de terceros.
Las tiendas configuradas con URL relativas al protocolo (//) en lugar de https:// generan rutas de imagen rotas para los iconos de las insignias de confianza.
Con el aplazamiento de JS activado, los manejadores onclick inline en las plantillas de módulos de terceros se disparan antes de que se carguen los scripts de los que dependen, causando errores 'function not defined'.
El widget de notificación de ventas en vivo muestra pedidos creados a través del back office con fines de prueba. Estos pedidos de prueba no deberían aparecer a los clientes.
El evento purchase se dispara en la página de confirmación del pedido y de nuevo cuando el callback del correo de estado del pedido genera una impresión de página. Los clientes que abren el correo del pedido generan un evento purchase duplicado.
En los listados de categoría en móvil, el texto del subtítulo se desborda y se superpone al precio del producto porque la altura de la tarjeta es fija.
Los rastreadores de los motores de búsqueda inflan el contador de vistas del producto. Solo el Googlebot añade cientos de 'vistas' al día.
Las direcciones de correo que contenían un carácter + (p. ej., user+shop@gmail.com) eran rechazadas durante el pago como invitado, a pesar de cumplir con las RFC.
El navegador de incidencias carga todas las incidencias en memoria antes de paginar en el lado del cliente. Las tiendas con más de 500 incidencias experimentan un retraso notable y problemas de memoria del navegador.
Guardar el contenido de una pestaña la mueve a la última posición. El campo de posición no se incluye en los datos del formulario durante un guardado solo de contenido.
El módulo se engancha a displayProductExtraContent, pero los parámetros del hook cambiaron en PS 9.0 — el objeto Product ahora está envuelto en un ProductPresenter.
Después de que PrestaShop aplica una actualización menor automática, el verificador de integridad de archivos marca todos los archivos core actualizados como 'modified', generando cientos de alertas falsas.
La marca de tiempo anti-spam oculta podía inicializarse demasiado tarde en el tema Hummingbird cuando los scripts se cargaban en diferido o el DOM del formulario cambiaba tras la carga de la página.
Las tiendas con mucho tráfico agotan el límite de la API Instagram Basic Display (200 solicitudes/hora) porque cada carga de página realiza una llamada a la API en vivo.
Cada ejecución del cron registra la hora de inicio, la hora de fin y la salida sin ninguna rotación. Tras meses de funcionamiento, la tabla de logs supera 1GB en tiendas activas.
El botón flotante de pago exprés quedaba empujado por debajo del área visible en dispositivos móviles cuando el carrito contenía más de 5 líneas de artículos.
Cuando TheCheckout de Prestasmart estaba instalado junto a Checkout Revolution, ambos módulos intentaban sobrescribir la página de checkout, provocando un bucle de redirecciones o un checkout en blanco. Afectaba a los clientes que usaban TheCheckout como checkout predeterminado y Checkout Revolution solo para los botones express.
Los patrones de URL personalizados para páginas CMS (p. ej., /help/returns en lugar de /content/3-returns) crean un conflicto de enrutamiento en el que responden tanto la ruta del módulo como la ruta nativa de PrestaShop, causando errores 404 intermitentes.
Las preguntas que contienen comillas dobles (p. ej., ¿Cómo usar el modo "avanzado"?) rompen el enlace del atributo data porque las comillas no se escapan.
La ordenación por arrastrar y soltar funciona para los elementos individuales de FAQ dentro de una categoría, pero no para reordenar las propias categorías. La lista de categorías no inicializa la librería Sortable.js.
La comprobación del tamaño del archivo usa filesize() de PHP, que devuelve false para archivos mayores de 2GB en sistemas de 32 bits. Incluso en 64 bits, leer el archivo completo en memoria para el análisis provoca un fallo.
Algunos clientes informaron de una pantalla en blanco tras ser redirigidos de vuelta desde PayPal. Esto ocurría cuando la cookie de sesión caducaba durante el flujo de pago o cuando la URL de redirección contenía una respuesta no válida.
La detección de huérfanas solo comprueba las asociaciones de productos, no el contenido de las páginas CMS. Las imágenes incrustadas en el HTML de páginas CMS mediante etiquetas se marcan como huérfanas y se eliminan.
La función 'Limpiar reglas de carrito caducadas' elimina las reglas de carrito donde date_to < NOW(), pero esto incluye reglas todavía activas y asignadas a pedidos futuros.
El contador 'X de Y canjeados' de las ofertas de cantidad limitada siempre muestra 0. El contador lee de la tabla de uso de cart_rule, pero el nombre de la columna cambió en PS 8.0.
Procesar imágenes PNG de alta resolución (3000px+) con ImageMagick agota el límite de memoria configurado, deteniendo por completo la cola de optimización.
Cuando se acumulan varios descuentos porcentuales (p. ej., fidelidad 10% + venta flash 50% + cupón 25%), el total puede volverse negativo.
Un descuento programado para el '1 de marzo a las 00:00' se activa a medianoche UTC, que es la 1 de la madrugada CET (zona horaria de la tienda). Para ventas flash sensibles al tiempo, es un problema importante.
Los valores de atributos que contienen caracteres especiales (como '6" pipe' o 'M&S compatible') se muestran como '6" pipe' en el desplegable del filtro del administrador.
La regla 'Compra 2 y llévate 1 gratis' se aplica a productos de categorías explícitamente excluidas de la regla de descuento. La comprobación de exclusión solo valida la categoría principal, no todas las categorías asociadas.
Las cabeceras CSP de PrestaShop 9.0 bloquean el script de incrustación de TikTok desde www.tiktok.com porque no está en los orígenes permitidos predeterminados.
Un cliente con cuentas en varias tiendas ve los tickets de todas las tiendas fusionados en una sola lista. El ID de cliente es compartido, pero el contexto del ticket no está filtrado por tienda.
La Content Security Policy predeterminada de PrestaShop 9.0 bloquea la ejecución de scripts inline, impidiendo la carga del widget de Crisp. La consola muestra 'Refused to execute inline script'.
Cambiar el estado del ticket mediante el desplegable de acciones masivas no dispara el correo de notificación. Solo los cambios de estado individuales envían correos.
En conexiones rápidas, el contenido de la página protegida es visible brevemente durante 200-300ms antes de que el overlay de contraseña basado en JavaScript lo cubra.
El botón flotante de WhatsApp y el banner de consentimiento de cookies se anclan ambos a la esquina inferior derecha, superponiéndose en móvil.
Migrar la base de datos a un nuevo servidor o restaurarla desde una copia de seguridad reinicia el valor de AUTO_INCREMENT, lo que puede generar números de pedido personalizados duplicados.
La subida de adjuntos del ticket rechaza los PDF de más de 2MB con un error genérico. El límite de subida estaba hardcodeado en la validación JavaScript pero sin documentar.
Cuando un nombre de producto contiene & (p. ej., 'Salt & Pepper Mill'), el enlazador inyecta una etiqueta de ancla que corrompe la entidad HTML, produciendo un marcado roto.
PrestaShop 9.0 cambió el listado CMS del panel de administración a controladores Symfony. El hook del módulo que renombra las páginas CMS en el menú ya no se dispara en el nuevo controlador.
El hook de creación del ticket se dispara dos veces al enviar el formulario — una desde el controlador y otra desde la validación AJAX.
Las tiendas con muchas categorías solo ven las primeras 50 en el constructor del menú. La consulta del árbol de categorías usa un LIMIT 50 por defecto.
La burbuja del widget de chat aparece tras un retraso de 2 segundos, empujando el contenido del pie de página hacia arriba y provocando un Cumulative Layout Shift notable.
Al pagar con Stripe, el correo de confirmación del pedido se enviaba una vez por el gestor del webhook de Stripe y otra por el hook estándar de validación del pedido, lo que generaba correos duplicados.
Los logotipos de clientes subidos en el admin se muestran a su resolución original (a menudo de más de 2000 px de ancho) aunque se visualizan a 150 px de ancho, provocando un peso de página enorme.
Tras tocar un enlace del menú en el móvil, el overlay permanece abierto mientras la página navega, provocando un destello del menú en la nueva página.
El texto del mega menú hereda el color del body de la página (blanco sobre blanco) cuando el tema usa una cabecera invertida.
Al mover el ratón en diagonal desde el elemento del menú hacia el desplegable, este se cierra porque el puntero abandona brevemente la zona de activación.
El sale_price_effective_date usa el formato 'Y-m-d', pero Google exige ISO 8601 con desfase horario (2025-06-15T00:00:00+02:00).
Los productos con stock 0 siguen apareciendo en el feed cuando la opción 'excluir agotados' está activada. La consulta de stock usa la cantidad a nivel de producto en lugar del stock_available a nivel de combinación.
Cuando se elimina un pedido, el stock que se descontó durante el pedido no se restaura, provocando discrepancias de inventario.
Cuando el servidor Redis no está disponible, el módulo recurre en silencio a la caché basada en archivos sin ninguna notificación al administrador. La tienda parece funcionar, pero con un rendimiento degradado.
En páginas de carga rápida, el dataLayer.push() de page_view se ejecuta antes de que el script del contenedor de GTM se haya cargado, lo que provoca la pérdida del primer evento page_view.
El escaneo de seguridad completo consulta todo el catálogo de productos y el historial de pedidos, adquiriendo bloqueos de tabla que ralentizan las operaciones del front office durante el horario comercial.
El escaneo de vista previa muestra '1.247 entradas huérfanas', pero al ejecutar la limpieza solo se eliminan 1.102. La consulta de la vista previa no filtra por contexto de tienda, mientras que la eliminación sí lo hace.
Las variantes de producto (combinaciones) no incluyen el código de barras EAN-13 en el feed aunque esté configurado en la combinación. El generador del feed solo lee el EAN del producto padre.
Google Merchant Center rechaza los productos con enlaces de imagen HTTP. La generación de URL de imágenes no respeta la configuración force_ssl.
El popup de suscripción a la encuesta de Opiniones de Clientes de Google se muestra en la página de confirmación del pedido incluso cuando el pago falló o fue cancelado, pidiendo a los clientes que valoren una compra que no completaron.
Los tickets con solo notas internas del personal (sin respuesta del cliente) nunca se cierran automáticamente porque la marca de tiempo de la última actividad usa únicamente las respuestas de los clientes.
La generación del feed XML se ejecuta como una única petición HTTP y agota el tiempo de espera a los 30 segundos con catálogos grandes.
Cuando dos banners están asignados al mismo hook con la misma prioridad, se renderizan uno encima del otro en lugar de apilarse verticalmente. El CSS usa position:absolute sin tener en cuenta los elementos hermanos.
Anteriormente, cambiar entre métodos de pago (p. ej., de Stripe a PayPal) restablecía el transportista seleccionado al predeterminado. Esto se ha corregido en la versión 3.2.1.
El enlace profundo de LINE (line://...) no abre nada en dispositivos sin la aplicación LINE, dejando a los clientes confundidos. No se ofrece ningún respaldo a la versión web.
En iOS, el enlace profundo t.me redirige a la App Store si Telegram no es el manejador predeterminado, incluso cuando la aplicación está instalada.
Cada carga de página desencadena llamadas API a Facebook, Pinterest y LinkedIn para obtener los contadores de compartición, añadiendo 500-1000ms al tiempo de carga de la página.
Pulsar Enter en el campo de email dispara tanto el evento submit del formulario como el manejador keydown, provocando dos peticiones de suscripción a Mailchimp. La segunda petición falla con 'already subscribed'.
En tiendas con idiomas RTL (árabe, hebreo), el carrusel se anima en la dirección incorrecta y el texto se alinea de izquierda a derecha, dificultando la lectura de los testimonios.
Las solicitudes a la API de recuento de compartidos devuelven 0 porque Facebook retiró la API pública de recuento de compartidos en 2024. Los contadores muestran valores a cero engañosos.
El evento ViewContent pasa un único ID de producto como cadena en lugar del formato de array requerido, lo que hace fallar la coincidencia con el Catálogo de Facebook para los anuncios dinámicos.
Las publicaciones de Facebook incrustadas tienen un ancho fijo de 500px que desborda el contenedor en dispositivos móviles, provocando desplazamiento horizontal.
Los rastreadores de los motores de búsqueda que siguen los enlaces de los banners inflan las estadísticas de clics. El seguimiento no distingue entre visitantes humanos y bots.
Filtrar por rango de fechas sin seleccionar explícitamente los estados de pedido incluye todos los pedidos sin importar su estado, incluidos los cancelados y con error.
El reproductor de YouTube incrustado comienza a reproducir con audio cuando el feed entra en el viewport, infringiendo las políticas de reproducción automática de los navegadores y sobresaltando a los visitantes.
El botón de cierre blanco (×) es invisible en banners con fondos claros/blancos.
Las imágenes de banner a ancho completo desbordan el viewport en dispositivos móviles, provocando scroll horizontal. El contenedor de la imagen tenía width:100% pero la propia imagen no tenía restricción de max-width.
Las tiendas B2B que muestran precios sin impuestos siguen informando el total del pedido con impuestos incluidos como valor de conversión, inflando el ROAS reportado en Google Ads.
En el tema Hummingbird se renderizan tanto la navegación del tema como el mega menú, provocando menús duplicados.
Los banners programados para una fecha/hora concreta aparecen 1 hora antes cuando cambia el horario de verano. El programador no tiene en cuenta el cambio de desfase horario.
El pase de banners sigue avanzando cuando la pestaña del navegador está en segundo plano, consumiendo CPU. Cuando el usuario vuelve, ve una diapositiva aleatoria en lugar de donde lo dejó.
Una página de producto sobre 'Shower Drain' crea un enlace interno hacia sí misma cuando el término 'shower drain' aparece en la descripción del producto.
El widget de reseñas de Trustpilot se carga de forma asíncrona y desplaza el contenido 120px hacia abajo al renderizarse, lo que penaliza la puntuación CLS en Google PageSpeed.
Los eventos de compra del lado del servidor son rechazados por la API de X con el error 'missing twclid' porque el ID de clic del clic original en el anuncio no se guarda a lo largo del flujo de compra.
Cuando un proceso por lotes acredita puntos históricos, los clientes que cruzan un umbral de nivel no reciben la notificación de subida de nivel. La comprobación del nivel solo se ejecuta en las adiciones de puntos en tiempo real.
Los clientes con conexiones móviles lentas reciben puntuaciones bajas de reCAPTCHA v3 (por debajo de 0.5) porque las señales de interacción de la página no se cargan por completo antes del envío del formulario, provocando bloqueos por falsos positivos.
Si el grupo de un cliente cambia (p. ej., ascendido a VIP por el admin), el nivel de descuento sigue usando el grupo antiguo hasta que el cliente cierra sesión y vuelve a entrar, porque el nivel se cachea en la sesión.
Añadir un producto al carrito vía AJAX reemplaza el contenido de la página pero no reinicializa el Intersection Observer de las imágenes de carga diferida, por lo que nunca llegan a cargarse.
La lista del administrador carga en memoria todas las entradas del historial de puntos para la paginación. Las tiendas con muchos clientes y pedidos acumulan cientos de miles de filas.
Una condición de pago 'Net 30' en un pedido de viernes fija el vencimiento en sábado. Los sistemas contables rechazan facturas con vencimiento en fin de semana.
La validación del código de referido distingue mayúsculas y minúsculas, por lo que 'FRIEND20' no coincide con 'friend20'. Los clientes que copian los códigos de los correos a menudo acaban con otra capitalización.
El correo de notificación de caducidad de puntos se envía siempre en el idioma predeterminado de la tienda en lugar del idioma preferido del cliente.
El script de inicialización del píxel de Quora asume que jQuery está disponible globalmente. En el tema Hummingbird (que no carga jQuery por defecto), el píxel falla con 'jQuery is not defined'.
La tarea cron activa las ventas a la hora programada, pero los permisos de los archivos de las reglas de carrito generadas difieren de los del usuario del servidor web. Los archivos de caché de las reglas de carrito no se pueden leer.
El popup AJAX del carrito muestra los productos pack sin la insignia de pack, sin dejar claro que el producto es un pack con su contenido.
Usar saldo de tienda junto con un descuento porcentual de regla de carrito provoca un error Negative amount. El saldo se aplica después del descuento porcentual, pero el porcentaje se calcula sobre el total previo al saldo, con lo que la reducción combinada supera el importe del pedido.
Los eventos del píxel de Facebook encolados antes del consentimiento (p. ej., el PageView de la página de aterrizaje) se perdían de forma permanente tras concederse el consentimiento. El píxel se disparaba para los eventos nuevos, pero la cola previa al consentimiento se descartaba.
Las insignias diseñadas con efectos de transparencia son invisibles sobre imágenes de producto que también tienen fondos transparentes, ya que ambas capas transparentes se funden.
Cuando la tienda tiene force_ssl activado, la URL canónica generada sigue usando http:// porque el módulo lee el dominio de la configuración sin comprobar el ajuste de SSL.
La línea de tiempo visual en la página de detalle del pedido solo carga los últimos 90 días de eventos. En pedidos B2B de larga duración se pierden así el pedido original y las primeras comunicaciones.
Cancelar un artículo de un pedido con varios artículos descuenta los puntos de todo el pedido en lugar de solo los del artículo cancelado. El gestor de cancelaciones usa el total de puntos del pedido, no los puntos por artículo.
El nombre para mostrar de Skype for Business se trunca en el primer carácter especial (& o
Las páginas de categoría con paginación (página 2, 3, etc.) no tenían ninguna etiqueta canonical, permitiendo que Google indexara cada URL paginada como contenido independiente.
Los invitados que después crean una cuenta no reciben puntos por los pedidos realizados antes de crearla. La asociación del pedido ocurre después de que se dispare el hook de cálculo de puntos.
Al cambiar la cantidad de un producto en un pedido existente, el total del pedido se actualiza, pero los descuentos asociados de las reglas de carrito (p. ej., 'envío gratis a partir de 100 €') no se recalculan.
Cada dirección del cliente crea un contacto de ActiveCampaign distinto, porque la sincronización usa email+dirección como clave única en lugar de solo el email.
El precio original tachado solo aparece en la página de detalle del producto, no en las tarjetas del listado de productos de la categoría. A la plantilla de categoría le faltaba el bloque de visualización del descuento.
Los endpoints AJAX del panel financiero devuelven 404 cuando el idioma de la interfaz de administración no es inglés. La URL del controlador AJAX estaba codificada con el prefijo de idioma inglés.
Crear una regla de venta para más de 50 productos provoca un timeout de PHP porque cada producto lanza una consulta independiente de creación de regla de carrito.
Las reglas de baneo que usan notación CIDR (p. ej., 2001:db8::/32) se ignoran porque la función de comparación solo maneja rangos IPv4.
El correo de resumen de fin de venta lista todos los productos en oferta de todas las tiendas en lugar de solo los productos de la tienda actual.
Las galerías de producto con URL de vídeo (YouTube, Vimeo o alojado en el propio servidor) muestran un marcador de posición genérico con botón de reproducción en lugar de una miniatura real del vídeo. El módulo extrae correctamente los ID de vídeo de las URL mediante expresiones regulares, pero no obtiene la imagen de miniatura real desde la API de la plataforma de vídeo.
YouTube proporciona miniaturas en https://img.youtube.com/vi/{id}/maxresdefault.jpg y Vimeo a través de su API oEmbed. Actualmente no se usa ninguna de las dos fuentes — el módulo recurre a una superposición estática con icono de reproducción en SVG.
En PrestaShop 1.7.6 con PHP 7.2, la página de pago se bloquea debido a declaraciones de propiedades tipadas que no son compatibles con PHP 7.2.
La insignia '-30%' calcula el descuento a partir del precio base, pero cuando un producto ya tiene un precio específico, el descuento real es diferente.
Los productos añadidos al carrito antes de que comience una venta flash no reciben el descuento cuando la venta se activa. El precio del carrito se almacena en caché y no se recalcula cuando se activan nuevas reglas de carrito.
Las transferencias entre almacenes se registran como dos eventos separados (disminución + aumento) en lugar de un único registro de transferencia. Esto hace imposible rastrear el movimiento.
Las referencias de pedido de más de 10 caracteres se cortan en el CSV exportado porque la columna estaba definida con un formato de ancho fijo.
El widget de chat siempre se muestra en inglés independientemente del idioma de la tienda seleccionado por el cliente, porque el parámetro de locale no se pasa durante la inicialización.
El registro de actividad de administradores no tiene mecanismo de rotación ni de limpieza. En tiendas activas con varios administradores, la tabla de registros supera los 500MB en un año.
La cuenta atrás llega a 00:00:00 y luego muestra valores negativos (-00:00:15) porque la hora de fin se calcula en el servidor mientras la cuenta atrás se ejecuta en el cliente.
Las descripciones de las categorías de cookies (Esenciales, Estadísticas, Marketing) están escritas en inglés de forma fija. Las tiendas multiidioma muestran las descripciones en inglés independientemente del idioma del visitante.
Al subir 3 archivos a la vez mediante la interfaz de arrastrar y soltar del administrador, solo se guarda el último archivo. El manejador de subida asíncrona usa el mismo nombre de archivo temporal para todas las subidas concurrentes.
El hook de exportación de datos RGPD no incluye el historial de consentimiento de cookies del cliente (cuándo se aceptó, qué categorías).
Añadir un archivo nuevo a un producto que ya tiene la versión 3.2 restablece el contador de versión a 1.0 en lugar de incrementarlo automáticamente a 3.3. El campo de versión se restablecía durante el envío del formulario.
Los productos asignados a una oferta semanal siguen visibles en la sección de rebajas después de finalizar la semana de promoción, porque el cron de limpieza no elimina las entradas de specific_price.
Cuando la caché de página completa está activa, todos los visitantes ven la misma página cacheada — con o sin el banner de cookies. El estado del banner no se puede personalizar con caché del lado del servidor.
Las URL de las entradas del blog faltan en el sitemap XML generado por SEO Revolution. El módulo de blog no registra sus URL en el hook de generación del sitemap.
Cambiar la URL amigable de un producto de /old-name a /new-name crea una redirección. Cambiarla de nuevo a /newest-name crea una cadena: /old-name → /new-name → /newest-name en lugar de actualizar la primera redirección.
Cuando un visitante rechaza las cookies, el módulo bloquea TODA la ejecución de scripts, incluida la funcionalidad esencial del sitio como las operaciones del carrito y la navegación. El mecanismo de bloqueo era demasiado agresivo.
Los idiomas añadidos manualmente (no procedentes del paquete de idiomas predeterminado de PrestaShop) muestran un icono de imagen rota porque el módulo busca las imágenes de bandera en el directorio /img/flags/ del tema usando el código ISO.
Después de restablecer la configuración del módulo, los grupos de atributos creados por el usuario, como "Material" o "Temporada", no vuelven a aparecer en la lista de filtros disponibles. La operación de restablecimiento vacía la tabla de mapeo mprfilterrevolution_template_item, que almacena la asociación entre grupos de atributos y plantillas de filtros.
Se trata de una limitación de diseño — el módulo no puede distinguir entre mapeos de filtros creados por el usuario y los predeterminados durante la reinstalación.
El contenido de la ventana de preferencias de cookies desborda el viewport en móviles sin posibilidad de desplazamiento. La capa del modal intercepta los eventos táctiles.
Los productos con stock cero pero con la opción 'permitir pedidos sin stock' activada aparecen bajo el filtro 'En stock'. Esto confunde a los clientes, que esperan ver productos realmente disponibles.
El panel de analítica de búsquedas no registra las búsquedas que devuelven cero resultados, que son las más valiosas para identificar productos o contenidos que faltan.
El script de GA4 se ejecuta antes de comprobar el consentimiento de cookies porque se carga mediante Google Tag Manager, que se inicializa de forma independiente.
Tras cambiar a la visualización de precios sin impuestos, añadir un producto al carrito vía AJAX restablece los precios con impuestos incluidos porque la respuesta AJAX no respeta la cookie del selector.
Las páginas de categoría paginadas (page=2, page=3) apuntaban su canonical a page=1, lo que Google interpreta como supresión intencionada de duplicados. Esto eliminó por completo las páginas paginadas del índice.
Si el nombre de un producto contiene una barra vertical (|), el parser del patrón de meta title trata todo lo que sigue como un placeholder de categoría, truncando el nombre real.
Un cliente que navega por la Tienda A y luego visita la Tienda B ve productos de la Tienda A en su sección de 'vistos recientemente', que pueden no existir o tener precios diferentes en la Tienda B.
Una URL canónica personalizada que empieza por http:// se sobrescribe a https:// cuando forzar SSL está activado, ignorando el valor canónico configurado explícitamente.
La cookie de consentimiento se establece con path='/' pero sin el atributo domain, por lo que no se envía en las peticiones a subdominios. En tiendas con prefijo www, la cookie establecida en www.domain.com no se lee en domain.com.
La biblioteca de exportación XLSX usa interpolación de cadenas de una forma obsoleta en PHP 8.2, generando un archivo corrupto.
Los productos sin wholesale_price definido muestran un coste de 0, distorsionando el informe de margen de beneficio, que muestra un margen del 100%.
La cookie de 'mostrar solo una vez por visitante' se establece como cookie de sesión en lugar de persistente, por lo que se borra al cerrar el navegador. Los visitantes que regresan vuelven a ver el popup.
Al añadir un nuevo idioma a la tienda se crean los archivos sitemap por idioma, pero el índice del sitemap (sitemap.xml) no se regenera para incluirlos.
Las diferencias de redondeo entre el cálculo de impuestos del módulo (round de PHP) y el redondeo nativo de PrestaShop (Tools::ps_round con PS_PRICE_ROUND_MODE) provocan discrepancias de 0.01-0.02 por pedido en los informes de impuestos.
El widget de MRR incluye incorrectamente pedidos que no son de suscripción, inflando la cifra de ingresos recurrentes. La consulta solo filtra por rango de fechas, no por tipo de pedido.
Cuando una página CMS tiene una URL amigable personalizada definida mediante el módulo, no se generan las etiquetas alternate hreflang. Las páginas estándar de producto y categoría funcionan correctamente.
La exportación masiva de facturas PDF para más de 1000 pedidos provoca un error de agotamiento de memoria de PHP. La exportación carga todos los datos de los pedidos en memoria de una vez.
Un pedido realizado a las 18:00 muestra 'Entrega antes del jueves' basándose en el envío el mismo día, pero la hora de corte del transportista son las 15:00, por lo que en realidad se envía mañana.
El CSV solo incluye la columna del importe total. Los contables necesitan columnas separadas para el importe neto, el tipo impositivo, el importe del impuesto y el total bruto.
La contraseña generada automáticamente se incrusta en texto plano en el correo de bienvenida, siendo visible en las vistas previas y susceptible de quedar en caché en los clientes de correo.
El informe multidivisa convierte todos los pedidos con el tipo de cambio actual en lugar del vigente en el momento de la compra. Los informes históricos cambian cada vez que se actualiza el tipo.
Cargar el SDK de Intercom de forma síncrona bloquea el hilo principal durante la carga de la página, añadiendo un retraso significativo a la métrica TTI.
La etiqueta hreflang x-default no se genera cuando el idioma predeterminado de la tienda tiene una URL sin prefijo de idioma (p. ej., /product-name en lugar de /en/product-name).
El gráfico de ingresos muestra los precios con impuestos incluidos, inflando los ingresos reportados. La consulta del informe no resta el impuesto de order_total cuando la tienda muestra los precios con impuestos incluidos.
Cuando un cliente de un grupo con precios especiales (p. ej. mayorista) usaba el pago exprés, no se aplicaba el precio con descuento. El importe de Stripe usaba el precio de catálogo en lugar del precio específico del grupo.
Las flechas izquierda/derecha no permiten navegar entre imágenes en modo pantalla completa. El listener de keydown estaba vinculado al contenedor del pase de diapositivas, que no recibe el foco.
El orden de las imágenes definido mediante arrastrar y soltar en la galería se pierde al guardar el producto. El campo de posición no se incluye en el formulario de guardado.
Las imágenes subidas a través de la API no activan el hook de generación de miniaturas. Los clientes ven un icono de imagen rota en las miniaturas pequeñas.
El gesto de pellizcar para hacer zoom en móvil es interceptado por el zoom nativo del navegador en lugar del zoom de la galería.
Los pagos por adeudo directo SEPA tardan 5–14 días hábiles en liquidarse. El webhook de charge.succeeded se disparaba días después del checkout, pero el manejador del estado del pedido no lo reconocía como el mismo pedido porque hacía la coincidencia por el ID de charge en lugar del ID de payment intent.
Las imágenes WebP se rechazan durante la subida con el error 'Invalid file format'. La lista de tipos MIME permitidos no incluía image/webp.
Un aumento del 10% sobre €9.99 da €10.989, que se redondea a €10.99 en lugar del €10.99 esperado (que en realidad debería mostrarse como €10.99 pero almacenarse de forma distinta). El problema es que €19.99 + 10% = €21.989 se redondea a €21.99 en lugar de €21.99.
El chatbot usa la preferencia de idioma del navegador en lugar del contexto de idioma actual de la tienda, mostrando respuestas en inglés a clientes francófonos en la tienda francesa.
La URL de compartir de Pinterest no especifica el parámetro media, por lo que el rastreador de Pinterest elige la primera imagen que encuentra en la página (a menudo el logo o un banner) en lugar de la imagen del producto.
El diseño de cuadrícula masonry deja huecos cuando las imágenes tienen proporciones variadas. La colocación automática de CSS grid no rellena los espacios vacíos.
Cuando se aplican filtros mediante AJAX en las páginas de categoría, la lista de impresiones de producto no se actualiza en el dataLayer, por lo que GTM solo registra los productos de la carga inicial de la página.
Cada pago con PayPal Express crea una nueva entrada de dirección incluso cuando el cliente ya tiene guardada una dirección idéntica, inundando la libreta de direcciones de duplicados.
Al duplicar un producto en el back office, los valores de atributos globales del producto de origen no se trasladan al duplicado.
La función de marca de agua modifica la imagen original subida en lugar de crear una copia con marca de agua. Si la marca de agua se elimina después, la imagen original ya está dañada.
En el tema Hummingbird (PS 8+), los botones de pago express heredaban un border-radius de 0px del reset de botones del tema, haciéndolos verse cuadrados en lugar del estilo redondeado estándar de Stripe.
Cuando el scroll infinito carga nuevos productos, el IntersectionObserver de la carga diferida no detecta las nuevas imágenes porque se añaden al DOM después de inicializarse el observer.
Los métodos de pago que redirigen a una pasarela externa (PayPal, transferencia bancaria) y luego vuelven a la página de confirmación no disparan el evento PURCHASE porque el contexto de sesión se pierde durante la redirección.
Los scripts de pruebas automatizadas que crean pedidos consumen la cuota de emails transaccionales de Brevo, porque los emails de confirmación de los pedidos de prueba se envían por el mismo canal que los pedidos reales.
Las historias son contenido efímero que caduca a las 24 horas. El widget de incrustación muestra un estado roto cuando la historia caduca, sin ningún respaldo elegante.
En iOS Safari, el evento touchend se dispara simultáneamente con el evento click, haciendo que la lightbox se abra y se cierre en el mismo frame.
Todas las ediciones del pedido aparecen como 'Modificado por el administrador' sin especificar qué cuenta de empleado administrador realizó el cambio.
La función de exportación CSV usa un límite fijo de 50 caracteres para los nombres de producto. Los productos con nombres más largos se cortan.
Las imágenes dentro del popup de Quick View nunca se cargan porque el Intersection Observer no detecta los elementos dentro de un overlay modal creado dinámicamente.
La fórmula del punto de pedido no tiene en cuenta el plazo de entrega por proveedor. Todos los almacenes muestran la misma sugerencia de reposición, independientemente de si el proveedor entrega en 2 días o en 2 semanas.
Cuando se vende un producto pack, el stock de los productos individuales se decrementa, pero el stock de las combinaciones para tallas/colores específicos no. El manejador de packs solo funciona a nivel de producto, no de combinación.
La visualización de estrellas redondea al entero más cercano en lugar de mostrar medias estrellas, haciendo que una media de 4.4 parezca 4.0 estrellas (visualmente engañoso).
Todas las marcas de tiempo de los movimientos de stock se muestran en UTC, lo que confunde a los comerciantes de otras zonas horarias. La consulta del informe no aplicaba conversión de zona horaria.
El escáner de códigos de barras usa eventos de teclado para capturar los códigos escaneados. En Firefox, el timing del evento keypress difiere, lo que provoca que se pierdan algunos caracteres.
La página de producto muestra una cantidad disponible distinta a la del módulo de almacén. El módulo cachea los niveles de stock con un TTL de 10 minutos, pero la página de producto lee directamente de ps_stock_available.
La alerta de stock bajo se dispara en cada ejecución del cron mientras el stock esté por debajo del umbral, enviando correos duplicados.
El número de factura se reserva al crear el pedido pero solo se utiliza si la factura se genera. Los pedidos cancelados consumen números, creando huecos en la secuencia.
Recargar o volver a visitar la página de confirmación del pedido vuelve a disparar el evento de conversión Purchase, provocando un seguimiento de conversiones duplicado.
El píxel de TikTok se inicializa y dispara page_view inmediatamente al cargar el script, antes de que se haya aceptado el banner de consentimiento de cookies. Esto infringe los requisitos de consentimiento del RGPD.
El token CAPTCHA está vinculado a la sesión del servidor, pero las páginas en caché no tienen sesión. El formulario envía un token CAPTCHA válido que no coincide con ninguna sesión del lado del servidor.
La importación de transferencias de stock desde CSV omite silenciosamente las filas donde la columna del almacén de origen está vacía (que significa 'desde el proveedor').
Cuando se realizan dos pedidos del mismo producto simultáneamente, ambos decrementan el stock a partir del mismo valor en caché, lo que resulta en stock negativo.
Con CCC activado, los archivos CSS/JS compilados no coinciden con las sumas de verificación originales, lo que dispara falsas alertas de 'archivo modificado'.
Activar las cabeceras CSP bloquea scripts de terceros, incluidos Google Analytics, Stripe.js y proveedores de fuentes. La política por defecto es demasiado estricta.
Al importar URL personalizadas desde un archivo CSV se omiten las filas que contienen caracteres Unicode (como ü, ñ, ø) sin ningún mensaje de error. La importación informa de éxito, pero esas URL faltan.
Apple Pay requiere un certificado SSL válido. Las tiendas que usan certificados autofirmados en desarrollo no muestran el botón de Apple Pay, sin ningún mensaje de error.
El escáner de malware usa exec() para la comparación de archivos, función que muchos proveedores de hosting compartido deshabilitan. No se muestra ningún error.
Los archivos de copia de seguridad de la base de datos se llaman backup_001.sql, backup_002.sql, lo que los hace adivinables si el directorio de copias está expuesto.
Una condición de carrera en el manejador de sesiones de empleados hace que el módulo detecte cada carga de página como un nuevo evento de inicio de sesión, inundando el correo del administrador.
La lista de moderación del panel de administración solo muestra el nombre del cliente y el texto de la reseña, sin la foto ni el nombre del producto. Los administradores deben entrar en cada reseña para ver a qué producto corresponde.
Tanto la burbuja de chat de Tawk.to como el botón de volver arriba ocupan la esquina inferior derecha, superponiéndose entre sí en todos los tamaños de pantalla.
La auditoría de seguridad marca todos los archivos override de módulos como amenazas potenciales, incluso los legítimos. Esto genera ruido en el informe.
Contraseñas comunes como 'Password123!' obtienen la puntuación 'Fuerte' porque el verificador solo valida la longitud y la variedad de caracteres, no los ataques de diccionario.
El limitador de peticiones cuenta las solicitudes de autocompletado de búsqueda AJAX como intentos de inicio de sesión. Tras 10 búsquedas rápidas, la IP del cliente queda bloqueada temporalmente.
Cuando un carrito contiene productos que se agotan entre la creación del carrito y el envío del email, el email de carrito abandonado muestra productos que el cliente no puede comprar.
Las páginas de categoría y las páginas de resultados de búsqueda no tienen configurada una imagen OG predeterminada, lo que hace que las plataformas sociales elijan una imagen aleatoria de la página o no muestren nada.
Si el proveedor de SMS no está disponible, los administradores no pueden completar el inicio de sesión 2FA y quedan bloqueados permanentemente.
Cuando la tienda está detrás de Cloudflare, el firewall ve las direcciones IP de Cloudflare en lugar de las IP reales de los visitantes. Todo el tráfico legítimo queda bloqueado.
Tras el Brexit, el módulo solo valida prefijos de IVA de la UE mediante VIES. Los números de IVA del Reino Unido (GB) se rechazan aunque debería usarse la API de HMRC.
Los clientes invitados reciben un enlace de descarga que apunta a la página de la cuenta de cliente, a la que no pueden acceder. El enlace debería apuntar a la página de seguimiento de pedidos de invitado con la descarga adjunta.
Las URL prefirmadas de S3 caducan por defecto a los 15 minutos. Con archivos grandes (>2GB) en conexiones lentas, la descarga se corta por timeout.
El feed incrustado muestra las publicaciones como simples enlaces compartidos, sin imágenes ni descripciones, porque la API de LinkedIn devuelve datos mínimos para las vistas previas de publicaciones incrustadas.
Los productos de categorías excluidas eluden la comprobación de exclusión cuando se añaden al carrito mediante una URL directa con el parámetro id_product en lugar de a través de la página del producto.
El extractor de CSS crítico no analiza las declaraciones de propiedades personalizadas de CSS (--var-name: value) y omite todo el bloque de reglas que las contiene, perdiendo estilos above-the-fold.
El plugin de chat de Messenger carga el SDK completo de JavaScript de Facebook (800KB+) en cada carga de página, afectando notablemente a las puntuaciones de velocidad.
Las contraseñas generadas automáticamente incluyen caracteres como 0, O, 1, l e I, que se confunden fácilmente al leerlas desde una carta de bienvenida impresa o una pantalla móvil.
Al crear un archivo ZIP con varios ficheros digitales, los ficheros con caracteres Unicode en el nombre (p. ej., 'présentation.pdf') se omiten silenciosamente. La clase ZipArchive necesita el flag ENC_UTF_8.
La notificación muestra 'John Smith from London just purchased...', revelando nombres y ubicaciones reales de los clientes sin su consentimiento.
La URL del feed registrada en Criteo cambia cuando se reinstala el módulo, porque el parámetro de token se regenera. Criteo recibe errores 404 en la URL antigua del feed.
La etiqueta de conversiones avanzadas envía al cargar la página el correo del cliente con hash SHA-256 antes de que el cliente haya aceptado las cookies de marketing, infringiendo el RGPD.
El editor de texto enriquecido de las notas de versión elimina el HTML al guardar, convirtiendo el texto con formato en texto plano. El AdminController usaba strip_tags en el paso de validación.
En tiendas que usan la opción 'Establecer el estado del pedido como Entregado para productos virtuales', la actualización de estado falla porque el hook del módulo se dispara antes de la comprobación de productos virtuales del núcleo.
Cuando un cliente reanuda una descarga parcial (petición HTTP Range), el contador de descargas se incrementa de nuevo, llegando finalmente al límite de descargas.
El historial de conversaciones del cliente está vinculado a un ID de visitante aleatorio. Cuando un cliente con sesión iniciada cierra sesión y vuelve a entrar, recibe un nuevo ID de visitante y pierde su historial de chat.
La subida de archivos de productos digitales de más de 64MB falla silenciosamente — la interfaz de administración indica éxito pero no se guarda ningún archivo. El problema es el valor por defecto de upload_max_filesize de PHP.
El correo de notificación al administrador de la tienda contiene el mensaje del cliente pero no indica sobre qué producto pregunta. El administrador tiene que adivinarlo por el contexto.
Los enlaces de descarga siguen activos incluso después de que el pedido se cancele o reembolse. La validez del enlace solo comprueba la fecha de caducidad, no el estado del pedido.
Los archivos PDF descargados quedan corruptos (0 bytes o con HTML antepuesto) cuando el búfer de salida de PHP está activado por otro módulo o por la configuración del servidor.
Las tiendas que usan transiciones de página basadas en AJAX disparan el evento page_view de UET dos veces — una en la carga inicial y otra en la navegación AJAX — inflando los recuentos de páginas vistas en Microsoft Advertising.
La comprobación de votos duplicados se basa en una cookie del navegador. Borrar las cookies o usar el modo incógnito permite emitir votos ilimitados sobre la misma solicitud de funcionalidad.
La comprobación de caducidad del enlace de descarga usa la hora del servidor, mientras que la generación del enlace usa la hora de la tienda. En servidores donde la zona horaria de PHP difiere de la de la tienda, los enlaces pueden caducar antes de que el cliente haga clic.
Si el empleado que creó la entrada tiene los campos de nombre vacíos, la línea de autor muestra solo '—' o queda en blanco.
Tras editar una entrada del blog en el back office, el front-end sigue mostrando el contenido antiguo hasta que la caché se limpia manualmente. La clave de caché no incluye la marca de tiempo de actualización de la entrada.
Tras activar el SSL, las imágenes incrustadas en el contenido de las entradas siguen apuntando a URL http://, mostrando avisos de contenido mixto e imágenes rotas.
La importación CSV solo actualiza el precio base del producto, ignorando los impactos de precio a nivel de combinación incluidos en el CSV. Los precios de las combinaciones no se modifican.
Las categorías del blog anidadas a más de 2 niveles (p. ej., News > Tech > AI) no son visibles en el árbol de categorías del admin. La consulta recursiva tenía un límite de profundidad de 2 codificado a mano.
El contador de ventas se incrementa al crear el pedido pero nunca se decrementa cuando los pedidos se cancelan o reembolsan, mostrando un total inflado.
Las animaciones activadas por desplazamiento con retraso (p. ej. revelados de tarjetas escalonados) nunca se reproducen si el usuario pasa el elemento antes de que transcurra el retraso, dejando espacios en blanco.
Los productos que solo tienen imágenes en formato WebP quedan excluidos del sitemap de imágenes porque el generador filtra únicamente las extensiones .jpg/.png.
El SDK de Klaviyo identifica a los visitantes por su email en cuanto lo introducen en cualquier campo de formulario (checkout, newsletter, contacto), rastreando su historial de navegación sin consentimiento explícito de marketing.
Las entradas programadas para publicación futura se publican de inmediato cuando la zona horaria del servidor difiere de la de la tienda. El planificador compara marcas de tiempo sin conversión de zona horaria.
Los productos con ecotasa muestran el importe de la ecotasa restado dos veces en el modo sin impuestos, porque la ecotasa ya está excluida del precio sin IVA.
El widget de productos relacionados al final de las entradas del blog muestra productos de todas las tiendas en lugar de solo la tienda actual.
El enlace con protocolo signal:// no funciona en navegadores de escritorio a menos que Signal Desktop esté instalado, sin ninguna indicación al usuario de qué ha fallado.
Los proveedores de hosting con cabeceras X-Frame-Options: SAMEORIGIN estrictas bloquean la carga del iframe del widget de Discord, mostrando un espacio en blanco en su lugar.
Caracteres como & y " en la segunda descripción de categoría aparecen en su forma codificada (&) porque Smarty aplica el escape dos veces: una en la plantilla del módulo y otra en el wrapper del tema.
Al hacer clic en 'Página siguiente' en el listado del blog se genera una URL como /blog?page=2 en lugar de /blog/page/2, devolviendo un 404. Los enlaces de paginación usan el formato de URL incorrecto cuando las URL amigables están activadas.
Aplicar un filtro vía AJAX reemplaza el contenido de la categoría, incluida la etiqueta H1, que vuelve al nombre de categoría predeterminado en lugar del H1 personalizado.
Los clientes de los grupos VIP o mayoristas ven los precios normales durante el pago exprés porque el contexto de grupo no se pasa al proveedor de pagos.
El script de inicialización de Zendesk Chat incluye la clave de API completa en una etiqueta script visible, que podría usarse para acceder a la API de Zendesk Chat.
La URL de compartición se genera con un token basado en la sesión. Cuando el cliente que comparte borra sus cookies, el enlace compartido queda invalidado para todos.
Al procesar una solicitud de eliminación de datos RGPD, el módulo no elimina ni anonimiza las reseñas de producto publicadas del cliente, dejando visibles su nombre y su contenido.
Un descuento de fidelidad del 15% sobre un producto de €0.50 se redondea a €0.08 de descuento, pero la comprobación del importe mínimo de la regla de carrito falla y aplica €0.00 en su lugar.
La limpieza de cuentas de invitado elimina las entradas de invitado más antiguas que el umbral configurado, pero no comprueba si esos invitados tienen contenidos de carrito no caducados. Esto pierde datos potenciales de recuperación de carritos abandonados.
La salida del feed RSS incluye etiquetas HTML sin procesar en el campo en lugar de texto plano. Algunos lectores RSS lo muestran incorrectamente.
En pantallas de menos de 375px de ancho, el banner de cookies cubre todo el viewport sin forma de desplazarse más allá, bloqueando en la práctica todo el contenido de la página.
El formulario de comentarios aparece al final de cada entrada aunque la opción 'Permitir comentarios' esté desactivada en la configuración del módulo. La plantilla comprobaba una anulación por entrada que no existía en lugar del ajuste global.
En navegadores de escritorio, al hacer clic en el botón de WhatsApp se abre la interfaz de WhatsApp Web pero la plantilla de mensaje prerrellenado está vacía, porque la codificación de la URL usa + en lugar de %20 para los espacios.
Al compartir una entrada del blog en redes sociales, la imagen destacada de la entrada no se incluye en og:image. La generación de metaetiquetas usaba el método equivocado para obtener la URL de la imagen.
La consulta GeoIP usa la IP del servidor proxy en lugar de la IP real del visitante, bloqueando o redirigiendo a clientes legítimos que usan VPN corporativas.
Los cambios de la API de Twitter en 2023 rompieron el endpoint del widget de cronología v1.1. Las cronologías incrustadas muestran el estado vacío genérico en lugar de los tuits.
Durante las ventas flash, varias notificaciones se ponen en cola y se muestran simultáneamente, cubriendo el contenido del producto y el botón de añadir al carrito.
El SDK completo de LiveChat y sus recursos (1,2 MB) se cargan en cada página, incluso cuando el chat está cerrado. Esto afecta significativamente a las puntuaciones de velocidad de página en móviles.
Las estimaciones de entrega cuentan los días festivos como días laborables, mostrando fechas de entrega demasiado optimistas (p. ej. 'Entrega antes del 25 de diciembre').
Cambiar el prefijo de ruta de /blog a /journal hace que todas las entradas existentes devuelvan 404, porque las URL antiguas no se redirigen.
Añadir un producto al carrito provoca una recarga de la página que pierde todos los filtros seleccionados. La actualización AJAX del carrito provocaba una recarga completa de la página en lugar de una actualización parcial.
Las imágenes en orientación vertical crean filas desiguales en la cuadrícula porque el CSS asume proporciones cuadradas derivadas del recorte por defecto de Instagram.
El rango del filtro de precio muestra precios sin impuestos incluso cuando la tienda está configurada para mostrar precios con impuestos. Los clientes ven precios distintos en el filtro y en las tarjetas de producto.
Si un producto está activo en inglés pero desactivado en francés, la etiqueta hreflang para el francés se genera igualmente, apuntando a una página 404.
Cuando ps_facetedsearch también está instalado (aunque esté desactivado), las URL de filtros del módulo entran en conflicto porque ambos usan el parámetro 'q'.
El Intelligent Tracking Prevention (ITP) de Safari limita la vida útil de las cookies establecidas mediante JavaScript a 7 días y las bloquea por completo en iframes, lo que hace que la cookie de consentimiento se pierda entre páginas.
Actualizar la cantidad de un artículo ya existente en el carrito vuelve a disparar el evento AddToCart, inflando el recuento de añadidos al carrito en Pinterest Analytics.
La actualización masiva procesa todas las imágenes en una sola petición HTTP, provocando un timeout en catálogos grandes.
El código de seguimiento de Hotjar se inyecta tanto en la página principal como en todos los iframes (pasarelas de pago, captcha, incrustaciones sociales), creando grabaciones duplicadas y sobrecarga de rendimiento.
Cuando la lógica del filtro está configurada como AND (deben coincidir todos los seleccionados), los productos con varios atributos del mismo tipo devuelven cero resultados. El JOIN de SQL era incorrecto — se necesitaba GROUP BY con HAVING COUNT.
Cuando un pedido pasa a un estado de flujo de trabajo personalizado, el correo de notificación usa la plantilla por defecto de PrestaShop en lugar de la plantilla personalizada del módulo, porque el directorio de plantillas de correo no está registrado.
Hacer clic rápidamente en las opciones de filtro provoca errores 'net::ERR_ABORTED', porque cada clic crea un nuevo XHR que cancela el anterior. El listado de productos parpadea.
En dispositivos móviles, si hay más de 5 grupos de filtros, el panel supera la altura del viewport sin posibilidad de desplazamiento. El contenedor del panel tenía overflow:hidden para la animación de escritorio.
Los datos estructurados de FAQ en las páginas de categoría no pasan la validación porque el @type se coloca dentro de un schema Product en lugar de como entidad FAQPage independiente.
PS 9.0 cambió el formato de almacenamiento de colores de atributos. El módulo lee el valor del color desde la columna heredada ps_attribute.color, eliminada en PS 9.0. Se adaptó para leer los datos de color desde la nueva estructura de metadatos de atributos, con respaldo a la columna clásica para versiones anteriores.
Aplicar filtros crea URL como /category/color-red/size-l que Google indexa como páginas independientes. Estas páginas filtradas compiten con la página principal de la categoría en los resultados de búsqueda.
En configuraciones multitienda, los filtros de atributos configurados para una tienda se cuelan en las demás tiendas. A la consulta de configuración de filtros le faltaba la condición id_shop.
Al hacer clic en 'Borrar todos los filtros' se restablecen los productos visibles, pero todas las insignias de conteo muestran (0). La consulta de conteo sigue aplicando los parámetros ya eliminados.
Tras aplicar filtros, el botón atrás del navegador no vuelve al estado sin filtrar. La URL se actualiza mediante pushState, pero el manejador de popstate no estaba implementado.
Seleccionar un filtro de color mediante AJAX restablece el deslizador de rango de precios a mín-máx en lugar de mantener el rango seleccionado por el usuario. Los límites de precio se recalculaban a partir del catálogo completo en lugar de los resultados filtrados.
Los productos con nombres que contienen & o " muestran las entidades HTML sin procesar en las sugerencias de autocompletado en lugar de los caracteres decodificados.
En las páginas de categoría, el desplegable de búsqueda queda recortado por el overflow:hidden del contenedor del listado de productos.
Los clientes que buscan por número de referencia de producto o código de barras obtienen cero resultados. El índice de búsqueda solo incluye nombre, descripción y etiquetas.
Cuando ps_searchbar también está activo, aparecen dos campos de búsqueda y las peticiones AJAX se disparan por duplicado.
En Android, pulsar el botón atrás con la superposición de búsqueda abierta navega a la página anterior en lugar de cerrar la superposición.
Tras muchas búsquedas, la cookie que almacena el historial supera el límite de 4 KB del navegador, lo que hace que todas las cookies se descarten silenciosamente. Esto rompe la sesión.
El desplegable del filtro de categoría en la página de resultados muestra las categorías, pero al seleccionar una se devuelven todos los resultados en lugar de filtrar. PS 9.0 cambió la consulta de la estructura del árbol de categorías.
La consulta de búsqueda tarda más de 3 segundos en tiendas con más de 10K productos porque une 5 tablas sin la indexación adecuada.
La instalación del módulo falla en MySQL 5.7 con el error 'Cannot create FULLTEXT index'. La tabla de búsqueda se creó con ROW_FORMAT=COMPRESSED, que no admite FULLTEXT en MySQL 5.7.
El autocompletado muestra productos sin stock con la política de inventario 'denegar pedido'. Los clientes hacen clic solo para descubrir que no pueden comprar.
Cuando la sesión del servidor expira, el endpoint de búsqueda AJAX devuelve una redirección 302 a la página de inicio de sesión como HTML. El JS del frontend intenta parsearlo como JSON y lanza 'Unexpected token
Los productos actualizados a través de la API WebService de PrestaShop no activan la actualización del índice de búsqueda. El módulo se engancha a actionProductUpdate, que la API no invoca.
Cuando la cabecera se vuelve sticky al hacer scroll, el desplegable de autocompletado se renderiza detrás de ella por un conflicto de z-index. El desplegable tenía z-index: 100 mientras que la cabecera sticky usa z-index: 1000.
Buscar 'über' o 'café' devuelve cero resultados aunque existen productos con esos términos. El índice FULLTEXT no hace coincidir los caracteres acentuados con sus equivalentes sin acento.
Cuando PrestaShop está configurado sin prefijos de idioma en las URL (un solo idioma por dominio), falta la etiqueta hreflang x-default. Google Search Console muestra el aviso 'missing hreflang x-default'.
El schema FAQ emite los elementos Question/Answer dentro del schema Product en lugar de como un schema FAQPage independiente. Google exige FAQPage como tipo de nivel superior para poder optar a los resultados enriquecidos.
El calculador de puntuación SEO divide entre cero cuando la descripción del producto está vacía, mostrando NaN% en lugar de una puntuación baja.
La importación CSV de redirecciones de URL masivas agota el tiempo de espera cuando el archivo contiene más de 500 filas. La importación se ejecuta en una única petición HTTP.
El módulo modifica el .htaccess para las directivas de robots, pero Nginx no lee los archivos .htaccess.
Los productos en categorías anidadas (p. ej., Home > Clothing > T-Shirts) generan elementos BreadcrumbList duplicados porque tanto el árbol de categorías como la página de producto emiten su propio schema de breadcrumbs.
La etiqueta meta og:image está vacía en las páginas de categoría, por lo que las publicaciones compartidas en redes sociales no muestran ninguna imagen de vista previa.
Crear una redirección de /old-product a /old-product/ provoca un bucle de redirección infinito porque el módulo las trata como URL distintas mientras que el servidor web las normaliza.
El módulo se engancha a displayHeader para establecer los meta titles, pero PS 9.0 lee la información meta antes en el ciclo de vida de la petición. El hook se dispara demasiado tarde y el meta title personalizado se ignora.
Los títulos de páginas CMS que contienen ampersands (&) o comillas producen XML no válido en el sitemap. Las URL no se codifican correctamente en XML.
La generación de la meta description corta a los 120 caracteres debido a un límite codificado de forma fija de la era de PS 1.6. Google admite hasta 320 caracteres en las meta descriptions.
El schema JSON-LD Product devuelve el precio base de catálogo en lugar del precio con descuento cuando se aplican reglas de precios específicos. Google muestra el precio equivocado en los resultados de búsqueda.
Si un producto está activo solo en inglés y alemán pero no en polaco, la etiqueta hreflang para el polaco se genera igualmente y apunta a una página 404.
Cuando la caché de Smarty sirve una página generada inicialmente con un parámetro de sesión, la URL canónica contiene ?PHPSESSID=xxx. Esto provoca problemas de contenido duplicado en Google Search Console.
No se muestra ningún mensaje de error cuando la clave publicable de Stripe procede del modo de prueba pero la clave secreta es de producción (o viceversa). El pago simplemente falla con un error genérico.
El controlador del webhook siempre devuelve HTTP 200, incluso cuando falla la creación del pedido. Esto impide que Stripe reintente los webhooks fallidos.
En productos con combinaciones (talla/color), los botones de pago exprés no aparecen hasta que se selecciona una combinación. El precio es desconocido hasta la selección, por lo que el PaymentRequest no puede inicializarse.
Los productos con precio de, p. ej., EUR 9.995 provocan un error de Stripe porque el importe en céntimos (999.5) no es un número entero.
El panel de Stripe muestra el aviso 'API version mismatch' porque el módulo usa una versión de API antigua (2023-10-16).
Tras añadir un producto al carrito mediante AJAX, el minicarrito se actualiza pero el botón de pago exprés no se vuelve a renderizar. La inicialización del botón solo se ejecuta al cargar la página.
El correo de confirmación del pedido usa el idioma predeterminado de la tienda en lugar del idioma seleccionado por el cliente. El contexto de idioma se pierde durante el procesamiento del webhook.
Cuando un cliente tiene un número de IVA en su dirección, este no se incluye en los metadatos del PaymentIntent de Stripe. Esto impide la generación automática de facturas con IVA en Stripe.
PHP 8.2 emite avisos de obsolescencia para las propiedades dinámicas. Al ObjectModel StripePayment le faltaba la declaración de la propiedad $secure_key.
El webhook de disputas intenta establecer un estado de pedido personalizado que no existe en instalaciones nuevas de PS 8.1. El estado se creaba durante la instalación del módulo en PS 1.7, pero al SQL de instalación le faltaba el formato de la tabla de estados de pedido de PS 8.x.
Cambiar del pago con tarjeta a Apple Pay restablece la selección del transportista a la opción más barata. El ID del transportista no se conservaba en la sesión entre los cambios de método de pago.
Cuando la función Combinar, Comprimir, Cachear (CCC) de PrestaShop está activa, el JS del módulo se carga antes que el SDK de Stripe.
Link rellena la dirección de envío desde el perfil de Stripe del cliente, que puede diferir de su dirección de PrestaShop. El cálculo del coste de envío usa la dirección de Stripe, pero el pedido guarda la dirección de PrestaShop, lo que provoca una discrepancia en el coste de envío.
Cuando el pago como invitado está habilitado y se completa un pago exprés, se crea una cuenta de cliente sin hash de contraseña. El cliente no puede iniciar sesión después.
En configuraciones multitienda, el gestor del webhook usa el contexto de la tienda predeterminada en lugar de la tienda donde se realizó el pedido. Esto hace que el pedido aparezca en la lista de pedidos de la tienda equivocada.
Los Payment Intents abandonados se acumulan en el panel de Stripe con el estado 'requires_confirmation' y nunca se limpian.
En dispositivos con menos de 375px de ancho (iPhone SE, Galaxy Fold), el contenedor del botón de pago exprés se desborda y cubre el precio del producto.
Cuando se procesa un reembolso parcial desde el panel de Stripe, el gestor del webhook crea una entrada de pago con un importe negativo. Esto hace que el total del pedido se muestre incorrectamente en el back office.
El pago exprés omite la página estándar del carrito, por lo que las reglas de carrito que conceden envío gratuito nunca se evalúan. El coste de envío en la hoja de pago siempre muestra el precio del transportista.
Chrome móvil bloquea la ventana emergente 3DS de Stripe porque se abre durante un callback asíncrono en lugar de mediante un gesto directo del usuario.
Condición de carrera entre el gestor de la URL de retorno y el webhook: ambos intentan validar el pedido. La segunda llamada falla con la excepción 'Order already validated'.
Tras completar el pago con PayPal Express, la redirección a order-confirmation.php falla con una página en blanco. El problema ocurre porque el callback de PayPal establece el ID del carrito en null antes de que el controlador de confirmación del pedido lo lea.
Cada pago exprés crea una nueva entrada de dirección incluso cuando el cliente ya tiene registrada una dirección idéntica.
Cuando la divisa de la tienda difiere de la divisa predeterminada de la cuenta de Stripe, la hoja de Google Pay muestra un código de divisa erróneo. El importe era correcto, pero el símbolo ISO 4217 se tomaba de la configuración de la cuenta de Stripe en lugar de la divisa del carrito de PrestaShop.
Safari 17.2 aplica un manejo más estricto de las cookies SameSite durante los callbacks de la Payment Request API. La hoja de pago de Stripe se abre, pero no recibe el total del carrito y muestra 'NaN' como importe.