Signalements en attente, bugs confirmés, statut des correctifs et entrées résolues

Problèmes connus des modules PrestaShop mypresta.rocks

Vérifiez les signalements en attente, les bugs confirmés, les notes de compatibilité, le statut des correctifs et les problèmes résolus avant de mettre un module à jour ou d'ouvrir un ticket de support.

Parcourir les problèmes

Les signalements restent visibles pendant leur examen

Une entrée publique commence généralement par un ticket de support, un test de compatibilité ou un signalement client. Les nouveaux signalements publics apparaissent d'abord en attente; après examen, nous vérifions le comportement, mettons à jour le module concerné lorsqu'un correctif est nécessaire, puis modifions le statut.

Les entrées ouvertes indiquent quoi vérifier avant une mise à jour

Utilisez cette page avant d'installer une mise à jour, de tester un module sur une nouvelle version de PrestaShop ou de décider si un ticket de support est nécessaire. Les problèmes ouverts expliquent ce qui est encore vérifié ou corrigé, tandis que la recherche et les filtres de statut vous aident à réduire rapidement la liste.

Les problèmes résolus restent visibles

Les entrées corrigées ne sont pas masquées après publication. Les conserver visibles rend l'historique du module plus facile à comprendre : vous voyez ce qui a été signalé, quel module était concerné et quand le problème a été traité.

382 problèmes suivisEntrées publiques du suivi0 en attente d'examenSoumis et en attente de tri1 actuellement ouvertsEncore en vérification ou correction378 résoluCorrigé et conservé visible99% taux de correctionEntrées publiques résolues2026-08-08 dernière mise à jourDernière modification du suivi

Ce qui se passe maintenant

Un aperçu rapide des signalements en attente, des problèmes ouverts et des correctifs récents. Utilisez le suivi complet ci-dessous pour rechercher par module, filtrer par statut ou trier toute la liste.

Tous les problèmes suivis

Recherchez par module ou détails du problème, filtrez par statut et triez par date de mise à jour ou nombre de signalements.

Aucun problème connu correspondant.

L'installation de 1.0.0 créait trois variables nommées d'après le catalogue de mypresta.rocks : un nombre de modules, un nombre de services et un nombre de packs. Une boutique vendant autre chose ouvrait l'écran Content Variables et y trouvait trois entrées sans conditions et sans signification pour son catalogue.

L'indication de l'écran Content Variables conseillait d'écrire un jeton pour un nombre de modules. Après correction des valeurs par défaut, cette clé n'existe plus sur une nouvelle boutique : l'exemple ne pointait vers rien et le premier essai renvoyait un résultat vide.

Supprimer un produit de la liste d'envies via AJAX met à jour la liste, mais le badge de l'icône de liste d'envies dans le header affiche toujours l'ancien compteur jusqu'au rechargement de la page.

Sur Safari iOS, le menu déroulant s'ouvre puis se ferme aussitôt, car la propagation de l'événement touchstart est gérée différemment, ce qui déclenche le gestionnaire de clic extérieur.

Le script obtp.js d'Outbrain et le gestionnaire de balises de Matomo modifient tous deux la propriété document.referrer, si bien que le script chargé en dernier lit une valeur de référent incorrecte.

Lorsque le service VIES de l'UE est lent ou indisponible, la requête de validation de TVA bloque pendant 30 secondes avant d'expirer, gelant l'étape de checkout.

Les boutiques derrière Cloudflare bannissent les adresses IP des proxys Cloudflare au lieu de l'IP réelle du visiteur, bloquant potentiellement des milliers de visiteurs légitimes passant par le même serveur edge.

Le générateur de sitemap s'exécute en un seul processus et atteint les limites de mémoire PHP sur les gros catalogues avec de nombreuses déclinaisons et images.

Les clients professionnels commandant en tant qu'invités ne voient pas l'option de paiement différé même lorsque leur numéro de TVA correspond aux critères B2B, car le module vérifie l'appartenance à un groupe de clients, ce qui nécessite un compte.

Les extensions de navigateur comme uBlock Origin bloquent le motif d'URL standard du script de suivi Matomo (/matomo.js), empêchant la collecte des données analytiques pour 25 à 40 % des visiteurs.

Lorsque le client revient sur la page de confirmation avant le déclenchement du webhook Stripe, la commande est validée deux fois. La seconde validation (webhook) lève une exception car la transition d'état de la commande est invalide.

Les produits avec de longues descriptions reçoivent un nombre excessif de liens injectés (parfois 15+), ce que les moteurs de recherche peuvent interpréter comme du spam de liens.

Avec 3 produits ou plus sélectionnés, le tableau de comparaison déborde du viewport sur mobile sans aucun indicateur de défilement horizontal, masquant les produits les plus à droite.

Le snippet JavaScript d'Olark utilise des constructions de type eval qui sont bloquées par les en-têtes CSP, empêchant le chargement du widget de chat.

Le script de suivi est chargé sur les pages du back-office via displayBackOfficeHeader, enregistrant l'activité des administrateurs à côté des sessions clients. Cela expose des données admin sensibles dans les enregistrements Clarity.

Les catégories vides (utilisées comme pages d'atterrissage informatives) n'affichent pas le second bloc de description car le template vérifie le nombre de produits avant d'afficher le moindre contenu de catégorie.

Le prix de l'Offer JSON-LD utilise le prix catalogue de base au lieu du prix après application des règles de prix spécifiques, des règles de taxe ou des réductions de groupe.

L'Insight Tag côté navigateur et la Conversions API côté serveur déclenchent tous deux le même événement de conversion sans clé de déduplication, ce qui amène LinkedIn Campaign Manager à comptabiliser les conversions en double.

Le bouton de retour en haut est visible même sur les pages plus courtes que la hauteur du viewport, où le défilement est impossible. Cela ajoute un encombrement visuel inutile.

Le token d'accès de page longue durée expire après 60 jours sans aucun avertissement dans le tableau de bord du module. Le flux cesse de se mettre à jour et affiche du contenu obsolète.

La fonction d'enregistrement de Smartsupp capture les frappes dans les champs des formulaires de paiement, ce qui peut enregistrer des données de carte sensibles dans les replays de session.

L'e-mail renvoyé régénère le récapitulatif de commande avec les prix actuels du catalogue, qui peuvent différer des prix au moment de la commande si les prix ont été modifiés.

Les codes de secours 2FA ne sont affichés qu'au moment de la configuration. Si l'admin les perd ainsi que son appareil d'authentification, il est définitivement bloqué.

La fonction de relecture de session capture les champs de saisie de mot de passe au checkout, affichant des caractères masqués qui pourraient potentiellement être corrélés aux frappes clavier.

Après qu'un visiteur a soumis n'importe quel formulaire contenant son e-mail sur le site, HubSpot associe rétroactivement tout son historique de navigation anonyme à son adresse e-mail, ce qui peut enfreindre le RGPD.

Les factures dans des devises utilisant la virgule comme séparateur décimal (EUR dans certaines locales) sont exportées avec des points, ce qui provoque des erreurs d'import dans les logiciels de comptabilité locaux.

Le module applique le lazy loading à toutes les images, y compris la première image produit qui apparaît dans le viewport au chargement de la page, provoquant un décalage de mise en page visible.

Le data layer transmet les prix des produits sous la forme '€29.99' (avec symbole monétaire) au lieu de '29.99' (numérique uniquement). Le système d'AdRoll ne parvient pas à analyser la valeur et perd les données de chiffre d'affaires.

Le carrousel à défilement automatique continue de faire défiler les logos même lorsque l'utilisateur les survole pour lire un nom de client ou cliquer sur un lien, rendant l'interaction frustrante.

Les animations CSS transform sur plusieurs éléments déclenchent la promotion en couches du compositeur, épuisant la mémoire GPU sur les mobiles d'entrée de gamme et provoquant des pertes d'images visibles.

L'événement de conversion envoie le total de la commande dans la devise par défaut de la boutique au lieu de la devise choisie par le client, provoquant des écarts de chiffre d'affaires dans les rapports Bing Ads.

Android 13 exige que les applications déclarent avec quelles autres applications elles peuvent interagir. Le lien d'intent viber:// échoue silencieusement sur les versions récentes d'Android.

Les produits sans avis génèrent quand même un bloc schema.org AggregateRating avec ratingCount=0. Google Search Console le signale comme une erreur de données structurées.

Si un produit s'appelle 'Blue Running Shoes' dans la catégorie 'Running Shoes', le modèle {product} - {category} produit 'Blue Running Shoes - Running Shoes', ce que les moteurs de recherche signalent comme du keyword stuffing.

Les montants de commande avec virgule décimale (format européen, p. ex. 99,99) cassent le paramètre de l'URL de postback S2S, entraînant le rejet de la conversion par Taboola.

L'événement fbq('track', 'Purchase') envoie toujours la devise par défaut de la boutique (EUR), même lorsque le client a payé en GBP, ce qui provoque un écart de chiffre d'affaires dans le Facebook Ads Manager.

Si la visibilité du tableau Pinterest est réglée sur 'Secret', le widget d'intégration affiche un état vide alors que le tableau contient des épingles. Aucune erreur n'est affichée.

La demande de compte professionnel accepte n'importe quel texte dans le champ du numéro de TVA, sans valider le format par rapport au modèle de TVA du pays sélectionné.

Les événements GA4 add_shipping_info et add_payment_info reposent sur un MutationObserver qui surveille la classe CSS .-current sur les éléments d'étape du checkout natif de PrestaShop. Les modules de checkout en une page, les thèmes de checkout personnalisés ou les modules utilisant d'autres indicateurs d'étape ne déclencheront pas ces deux événements spécifiques.

Tous les autres événements de tracking (begin_checkout, purchase, pages vues, ajout au panier) fonctionnent quel que soit le module de checkout utilisé — seuls les événements des étapes intermédiaires du checkout sont concernés.

PrestaShop 1.6 ne dispose pas du hook displayAfterBodyOpeningTag, donc les fallbacks noscript pour GTM, Meta Pixel et Pinterest Tag ne sont pas injectés. Cela n'affecte que les utilisateurs ayant complètement désactivé JavaScript, ce qui est extrêmement rare.

Impact : Minime. Les visiteurs sans JavaScript ne sont trackés par aucun pixel, avec ou sans balises noscript. Les fallbacks noscript servent principalement de signaux de vérification pour les plateformes.

Lorsque le renvoi des achats manqués se déclenche via cron, il génère un pseudo client ID (chiffres aléatoires + timestamp) car le cookie _ga du navigateur d'origine n'est pas disponible. Les achats renvoyés apparaissent donc comme des sessions/utilisateurs distincts dans les rapports GA4.

Contournement : Activer le suivi User-ID dans la configuration de la plateforme GA4. Si le client était connecté lors de l'achat, le User-ID reliera l'événement côté serveur à son profil utilisateur existant.

La spécification OneTag de Criteo limite les événements viewList à un maximum de 3 IDs produit. Les pages de catégorie avec plus de produits n'envoient que les 3 premiers IDs. C'est une limitation de la plateforme Criteo, pas un bug du module.

L'API du pixel Quora n'accepte pas de paramètres de revenus dans l'appel standard track('Purchase'). L'événement d'achat se déclenche correctement mais sans valeur de transaction. Il s'agit d'une limitation de l'API de tracking de Quora.

Une tâche cron qui échoue (ex. : timeout, erreur mémoire) est immédiatement relancée au prochain intervalle du cron, pouvant causer des milliers d'exécutions échouées par heure.

Les changements de statut via l'API WebService déclenchent à la fois le hook API et le hook admin, ce qui fait exécuter deux fois les actions automatisées (e-mails, mises à jour de stock).

Le code saisi dans l'éditeur de bloc HTML est assaini à l'enregistrement, supprimant toutes les balises . Cela empêche des cas d'usage légitimes comme l'intégration de widgets tiers.

Les boutiques configurées avec des URL relatives au protocole (//) au lieu de https:// génèrent des chemins d'images cassés pour les icônes des badges de confiance.

Lorsque le report du JS est activé, les gestionnaires onclick inline dans les templates des modules tiers se déclenchent avant le chargement des scripts dont ils dépendent, provoquant des erreurs 'function not defined'.

Le widget de notification de ventes en direct affiche les commandes créées via le back office à des fins de test. Ces commandes de test ne devraient pas apparaître aux clients.

L'événement purchase se déclenche sur la page de confirmation de commande, puis à nouveau lorsque le callback de l'e-mail de statut de commande génère une impression de page. Les clients qui ouvrent l'e-mail de commande génèrent un événement purchase en double.

Sur les listings de catégories mobiles, le texte du sous-titre déborde et chevauche le prix du produit, car la hauteur de la carte est fixe.

Les robots des moteurs de recherche gonflent le compteur de vues produit. Le Googlebot ajoute à lui seul des centaines de « vues » par jour.

Correction prévue : 01/04/2026

Les adresses e-mail contenant un caractère + (par ex. user+shop@gmail.com) étaient rejetées lors du paiement en tant qu'invité, alors qu'elles sont conformes aux RFC.

Le navigateur de signalements charge tous les signalements en mémoire avant de paginer côté client. Les boutiques avec plus de 500 signalements subissent un délai notable et des problèmes de mémoire du navigateur.

Enregistrer le contenu d'un onglet le déplace en dernière position. Le champ de position n'est pas inclus dans les données du formulaire lors d'un enregistrement du contenu seul.

Le module se greffe sur displayProductExtraContent, mais les paramètres du hook ont changé dans PS 9.0 — l'objet Product est désormais encapsulé dans un ProductPresenter.

Après une mise à jour mineure automatique de PrestaShop, le vérificateur d'intégrité des fichiers marque tous les fichiers core mis à jour comme 'modified', générant des centaines de fausses alertes.

Le timestamp anti-spam caché pouvait être initialisé trop tard sur le thème Hummingbird lorsque les scripts étaient différés ou que le DOM du formulaire changeait après le chargement de la page.

Les boutiques à fort trafic épuisent la limite de débit de l'API Instagram Basic Display (200 requêtes/heure), car chaque chargement de page effectue un appel API en direct.

Chaque exécution du cron journalise l'heure de début, l'heure de fin et la sortie sans aucune rotation. Après des mois d'exploitation, la table de logs dépasse 1GB sur les boutiques actives.

Le bouton flottant de paiement express était repoussé sous la ligne de flottaison sur les appareils mobiles lorsque le panier contenait plus de 5 lignes d'articles.

Lorsque TheCheckout de Prestasmart était installé en même temps que Checkout Revolution, les deux modules tentaient de remplacer la page de checkout, provoquant une boucle de redirection ou un checkout vide. Les clients utilisant TheCheckout comme checkout par défaut et Checkout Revolution uniquement pour les boutons express étaient concernés.

Les schémas d'URL personnalisés pour les pages CMS (p. ex. /help/returns au lieu de /content/3-returns) créent un conflit de routage où la route du module et la route native de PrestaShop répondent toutes deux, provoquant des erreurs 404 intermittentes.

Les questions contenant des guillemets doubles (par ex. Comment utiliser le mode "avancé" ?) cassent la liaison de l'attribut data, car les guillemets ne sont pas échappés.

Le tri par glisser-déposer fonctionne pour les éléments FAQ individuels au sein d'une catégorie, mais pas pour réordonner les catégories elles-mêmes. La liste des catégories n'initialise pas la bibliothèque Sortable.js.

La vérification de la taille du fichier utilise filesize() de PHP, qui renvoie false pour les fichiers de plus de 2GB sur les systèmes 32 bits. Même en 64 bits, charger le fichier entier en mémoire pour l'analyse fait planter le processus.

Correction prévue : 15/03/2026

Certains clients ont signalé une page blanche après la redirection depuis PayPal. Cela se produisait lorsque le cookie de session expirait pendant le processus de paiement ou lorsque l'URL de redirection contenait une réponse invalide.

La détection d'orphelins ne vérifie que les associations produits, pas le contenu des pages CMS. Les images intégrées dans le HTML des pages CMS via des balises sont marquées comme orphelines et supprimées.

La fonction « Nettoyer les règles panier expirées » supprime les règles panier dont date_to < NOW(), mais cela inclut des règles encore actives et affectées à des commandes futures.

Le compteur « X sur Y réclamés » des offres à quantité limitée affiche toujours 0. Le compteur lit la table d'utilisation cart_rule, mais le nom de la colonne a changé dans PS 8.0.

Le traitement d'images PNG haute résolution (3000px+) avec ImageMagick épuise la limite de mémoire configurée, ce qui arrête complètement la file d'optimisation.

Lorsque plusieurs remises en pourcentage se cumulent (par ex. fidélité 10% + vente flash 50% + coupon 25%), le total peut devenir négatif.

Une remise planifiée pour le « 1er mars 00:00 » s'active à minuit UTC, soit 1h du matin CET (fuseau de la boutique). Pour des ventes flash sensibles au timing, c'est un problème majeur.

Les valeurs d'attributs contenant des caractères spéciaux (comme '6" pipe' ou 'M&S compatible') s'affichent sous la forme '6" pipe' dans la liste déroulante du filtre admin.

La règle « 2 achetés, 1 offert » s'applique aux produits appartenant à des catégories explicitement exclues de la règle de remise. La vérification d'exclusion ne valide que la catégorie principale, pas toutes les catégories associées.

Les en-têtes CSP de PrestaShop 9.0 bloquent le script d'intégration TikTok depuis www.tiktok.com, car il ne figure pas dans les origines autorisées par défaut.

Un client ayant des comptes sur plusieurs boutiques voit les tickets de toutes les boutiques fusionnés dans une seule liste. L'ID client est partagé, mais le contexte du ticket n'est pas filtré par boutique.

La Content Security Policy par défaut de PrestaShop 9.0 bloque l'exécution des scripts inline, empêchant le chargement du widget Crisp. La console affiche 'Refused to execute inline script'.

Changer le statut d'un ticket via le menu d'actions groupées ne déclenche pas l'e-mail de notification. Seuls les changements de statut individuels envoient des e-mails.

Sur les connexions rapides, le contenu de la page protégée est brièvement visible pendant 200-300ms avant que l'overlay de mot de passe en JavaScript ne le recouvre.

Le bouton WhatsApp flottant et la bannière de consentement aux cookies s'ancrent tous deux dans le coin inférieur droit et se chevauchent sur mobile.

La migration de la base de données vers un nouveau serveur ou la restauration depuis une sauvegarde réinitialise la valeur AUTO_INCREMENT, ce qui peut générer des numéros de commande personnalisés en double.

L'upload de pièces jointes du ticket rejette les PDF de plus de 2MB avec une erreur générique. La limite d'upload était codée en dur dans la validation JavaScript mais non documentée.

Lorsqu'un nom de produit contient & (par ex. 'Salt & Pepper Mill'), le linker injecte une balise d'ancre qui corrompt l'entité HTML, produisant un balisage cassé.

PrestaShop 9.0 a fait passer la liste CMS de l'admin sur des contrôleurs Symfony. Le hook du module qui renomme les pages CMS dans le menu ne se déclenche plus sur le nouveau contrôleur.

Le hook de création du ticket se déclenche deux fois à la soumission du formulaire — une fois depuis le contrôleur et une fois depuis la validation AJAX.

Les boutiques avec de nombreuses catégories ne voient que les 50 premières dans le constructeur de menu. La requête de l'arborescence utilise un LIMIT 50 par défaut.

La bulle du widget de chat apparaît après un délai de 2 secondes, poussant le contenu du pied de page vers le haut et provoquant un Cumulative Layout Shift visible.

Lors d'un paiement avec Stripe, l'e-mail de confirmation de commande était envoyé une fois par le gestionnaire de webhook Stripe et une fois par le hook standard de validation de commande, ce qui produisait des e-mails en double.

Les logos clients téléversés dans l'admin sont affichés à leur résolution d'origine (souvent plus de 2000 px de large) alors qu'ils s'affichent à 150 px de large, provoquant un poids de page énorme.

Après avoir appuyé sur un lien du menu sur mobile, l'overlay reste ouvert pendant la navigation, provoquant un flash du menu sur la nouvelle page.

Le texte du méga menu hérite de la couleur du corps de la page (blanc sur blanc) lorsque le thème utilise un en-tête inversé.

Déplacer la souris en diagonale de l'élément de menu vers le menu déroulant provoque sa fermeture, car le pointeur quitte brièvement la zone de déclenchement.

Le sale_price_effective_date utilise le format 'Y-m-d' alors que Google exige le format ISO 8601 avec décalage horaire (2025-06-15T00:00:00+02:00).

Les produits avec un stock à 0 apparaissent toujours dans le flux lorsque l'option « exclure les ruptures de stock » est activée. La requête de vérification du stock utilise la quantité au niveau du produit au lieu du stock_available au niveau de la déclinaison.

Lorsqu'une commande est supprimée, le stock décrémenté lors de la commande n'est pas restauré, provoquant des écarts d'inventaire.

Lorsque le serveur Redis est injoignable, le module bascule silencieusement sur le cache basé sur fichiers sans aucune notification admin. La boutique semble fonctionner, mais avec des performances dégradées.

Sur les pages à chargement rapide, le dataLayer.push() pour page_view s'exécute avant que le script du conteneur GTM ne soit chargé, ce qui entraîne la perte du premier événement page_view.

Le scan de sécurité complet interroge l'ensemble du catalogue produits et de l'historique des commandes, en posant des verrous de table qui ralentissent les opérations du front office pendant les heures d'activité.

Le scan d'aperçu affiche « 1 247 entrées orphelines » mais l'exécution du nettoyage n'en supprime que 1 102. La requête d'aperçu ne filtre pas par contexte de boutique alors que la suppression le fait.

Les déclinaisons produit (combinaisons) n'incluent pas le code-barres EAN-13 dans le flux même lorsqu'il est renseigné sur la déclinaison. Le générateur de flux ne lit que l'EAN du produit parent.

Google Merchant Center rejette les produits avec des liens d'image en HTTP. La génération des URL d'images ne respecte pas la configuration force_ssl.

La popup d'opt-in à l'enquête Google Avis Clients s'affiche sur la page de confirmation de commande même lorsque le paiement a échoué ou a été annulé, demandant aux clients d'évaluer un achat qu'ils n'ont pas finalisé.

Les tickets ne contenant que des notes internes de l'équipe (sans réponse du client) ne sont jamais fermés automatiquement, car l'horodatage de la dernière activité n'utilise que les réponses des clients.

La génération du flux XML s'exécute en une seule requête HTTP et expire au bout de 30 secondes pour les gros catalogues.

Lorsque deux bannières sont assignées au même hook avec la même priorité, elles s'affichent l'une sur l'autre au lieu de s'empiler verticalement. Le CSS utilise position:absolute sans tenir compte des éléments frères.

Auparavant, le passage d'un mode de paiement à un autre (par ex. de Stripe à PayPal) réinitialisait le transporteur sélectionné à la valeur par défaut. Ce problème a été corrigé dans la version 3.2.1.

Le lien profond LINE (line://...) n'ouvre rien sur les appareils sans l'application LINE, laissant les clients désorientés. Aucun repli vers la version web n'est prévu.

Sur iOS, le lien profond t.me redirige vers l'App Store si Telegram n'est pas le gestionnaire par défaut, même lorsque l'application est installée.

Chaque chargement de page déclenche des appels API vers Facebook, Pinterest et LinkedIn pour récupérer les compteurs de partage, ajoutant 500-1000ms au temps de chargement de la page.

Appuyer sur Entrée dans le champ e-mail déclenche à la fois l'événement submit du formulaire et le gestionnaire keydown, provoquant deux requêtes d'inscription vers Mailchimp. La seconde requête échoue avec 'already subscribed'.

Sur les boutiques en langues RTL (arabe, hébreu), le carrousel s'anime dans le mauvais sens et le texte est aligné de gauche à droite, rendant les témoignages difficiles à lire.

Les requêtes vers l'API de comptage des partages renvoient 0 car Facebook a déprécié l'API publique de comptage des partages en 2024. Les compteurs affichent des valeurs à zéro trompeuses.

L'événement ViewContent transmet un ID produit sous forme de chaîne unique au lieu du format tableau requis, ce qui fait échouer la correspondance avec le Catalogue Facebook pour les publicités dynamiques.

Les publications Facebook intégrées ont une largeur fixe de 500px qui déborde du conteneur sur les appareils mobiles, provoquant un défilement horizontal.

Les robots des moteurs de recherche qui suivent les liens des bannières gonflent les statistiques de clics. Le suivi ne distingue pas les visiteurs humains des bots.

Filtrer par plage de dates sans sélectionner explicitement les statuts de commande inclut toutes les commandes quel que soit leur statut, y compris les commandes annulées et en erreur.

Le lecteur YouTube intégré démarre la lecture avec le son lorsque le flux entre dans la zone d'affichage, en violation des politiques de lecture automatique des navigateurs et au risque de surprendre les visiteurs.

Le bouton de fermeture blanc (×) est invisible sur les bannières à fond clair/blanc.

Les images de bannière pleine largeur débordent du viewport sur mobile, provoquant un défilement horizontal. Le conteneur d'image avait width:100% mais l'image elle-même n'avait aucune contrainte max-width.

Les boutiques B2B qui affichent les prix hors taxes déclarent quand même le total de commande TTC comme valeur de conversion, gonflant le ROAS rapporté dans Google Ads.

Sur le thème Hummingbird, la navigation du thème et le méga menu s'affichent tous les deux, provoquant des menus en double.

Les bannières planifiées pour une date/heure précise apparaissent 1 heure trop tôt lors du passage à l'heure d'été ou d'hiver. Le planificateur ne tient pas compte du changement de décalage horaire.

Le diaporama de bannières continue de défiler lorsque l'onglet du navigateur est en arrière-plan, consommant du CPU. Au retour de l'utilisateur, il voit une diapositive aléatoire au lieu de là où il s'était arrêté.

Une page produit sur 'Shower Drain' crée un lien interne vers elle-même lorsque le terme 'shower drain' apparaît dans la description du produit.

Le widget d'avis Trustpilot se charge de manière asynchrone et repousse le contenu de 120px vers le bas au moment du rendu, ce qui pénalise le score CLS dans Google PageSpeed.

Les événements d'achat côté serveur sont rejetés par l'API de X avec l'erreur 'missing twclid' car l'identifiant de clic du clic publicitaire d'origine n'est pas conservé tout au long du parcours d'achat.

Lorsqu'un traitement par lot crédite des points historiques, les clients qui franchissent un seuil de palier ne reçoivent pas la notification de montée de palier. La vérification du palier ne s'exécute que lors des ajouts de points en temps réel.

Les clients sur des connexions mobiles lentes obtiennent des scores reCAPTCHA v3 faibles (inférieurs à 0.5), car les signaux d'interaction de la page ne sont pas entièrement chargés avant l'envoi du formulaire, provoquant des blocages en faux positifs.

Si le groupe d'un client change (par ex. passage en VIP par l'admin), le palier de remise utilise toujours l'ancien groupe jusqu'à ce que le client se déconnecte et se reconnecte, car le palier est mis en cache dans la session.

L'ajout d'un produit au panier via AJAX remplace le contenu de la page mais ne réinitialise pas l'Intersection Observer des images en chargement différé, qui ne se chargent alors jamais.

La liste admin charge toutes les entrées de l'historique des points en mémoire pour la pagination. Les boutiques avec beaucoup de clients et de commandes accumulent des centaines de milliers de lignes.

Une condition de paiement 'Net 30' sur une commande du vendredi fixe l'échéance à un samedi. Les systèmes comptables rejettent les factures avec une échéance le week-end.

La validation du code de parrainage est sensible à la casse, donc 'FRIEND20' ne correspond pas à 'friend20'. Les clients qui copient les codes depuis les e-mails obtiennent souvent une casse différente.

L'e-mail de notification d'expiration des points est toujours envoyé dans la langue par défaut de la boutique au lieu de la langue préférée du client.

Le script d'initialisation du pixel Quora suppose que jQuery est disponible globalement. Sur le thème Hummingbird (qui ne charge pas jQuery par défaut), le pixel échoue avec 'jQuery is not defined'.

La tâche cron active les ventes à l'heure prévue, mais les permissions des fichiers des règles panier générées diffèrent de celles de l'utilisateur du serveur web. Les fichiers de cache des règles panier sont illisibles.

La popup AJAX du panier affiche les produits pack sans le badge pack, ce qui ne permet pas de comprendre que le produit est un pack avec son contenu.

Utiliser un avoir en même temps qu'une remise en pourcentage via règle panier provoque une erreur Negative amount. L'avoir est appliqué après la remise en pourcentage, mais le pourcentage est calculé sur le total avant avoir, si bien que la réduction combinée dépasse le montant de la commande.

Les événements du pixel Facebook mis en file d'attente avant le consentement (p. ex. PageView sur la page d'atterrissage) étaient définitivement perdus une fois le consentement accordé. Le pixel se déclenchait pour les nouveaux événements, mais la file d'avant-consentement était abandonnée.

Les badges conçus avec des effets de transparence sont invisibles sur les images produit qui ont elles aussi un fond transparent, les deux couches transparentes se fondant l'une dans l'autre.

Lorsque la boutique a force_ssl activé, l'URL canonique générée utilise toujours http:// car le module lit le domaine depuis la configuration sans vérifier le paramètre SSL.

La chronologie visuelle de la page de détail de commande ne charge que les 90 derniers jours d'événements. Pour les commandes B2B de longue durée, la commande initiale et les premiers échanges sont ainsi manquants.

L'annulation d'un article dans une commande à plusieurs articles déduit les points de toute la commande au lieu des seuls points de l'article annulé. Le gestionnaire d'annulation utilise le total des points de la commande, et non les points par article.

Le nom d'affichage Skype for Business est tronqué au premier caractère spécial (& ou

Les pages catégorie avec pagination (page 2, 3, etc.) n'avaient aucune balise canonique, permettant à Google d'indexer chaque URL paginée comme un contenu distinct.

Les invités qui créent ensuite un compte ne reçoivent pas les points des commandes passées avant la création du compte. L'association de la commande a lieu après le déclenchement du hook de calcul des points.

Lors de la modification de la quantité d'un produit dans une commande existante, le total de la commande est mis à jour, mais les remises des règles panier associées (par ex. « livraison gratuite dès 100 € ») ne sont pas recalculées.

Chaque adresse client crée un contact ActiveCampaign distinct, car la synchronisation utilise e-mail+adresse comme clé unique au lieu de l'e-mail seul.

Le prix d'origine barré n'apparaît que sur la fiche produit, pas dans les vignettes du listing de catégorie. Le bloc d'affichage de la remise manquait dans le template de catégorie.

Les points d'accès AJAX du tableau de bord financier renvoient une 404 lorsque la langue de l'interface d'administration n'est pas l'anglais. L'URL du contrôleur AJAX était codée en dur avec le préfixe de langue anglais.

La création d'une règle de vente pour plus de 50 produits provoque un timeout PHP, car chaque produit déclenche une requête de création de règle panier distincte.

Les règles de bannissement utilisant la notation CIDR (par ex. 2001:db8::/32) sont ignorées car la fonction de comparaison ne gère que les plages IPv4.

L'e-mail récapitulatif de fin de vente liste tous les produits en promotion de toutes les boutiques au lieu des seuls produits de la boutique courante.

Les galeries produit contenant des URL vidéo (YouTube, Vimeo ou auto-hébergées) affichent un bouton de lecture générique au lieu d'une véritable miniature de la vidéo. Le module extrait correctement les identifiants vidéo des URL via des expressions régulières, mais ne récupère pas l'image miniature réelle depuis l'API de la plateforme vidéo.

YouTube fournit des miniatures à l'adresse https://img.youtube.com/vi/{id}/maxresdefault.jpg et Vimeo via son API oEmbed. Aucune des deux sources n'est actuellement utilisée — le module se rabat sur une icône de lecture SVG statique en superposition.

Sur PrestaShop 1.7.6 avec PHP 7.2, la page de commande plante en raison de déclarations de propriétés typées non prises en charge par PHP 7.2.

Le badge '-30%' calcule la remise à partir du prix de base, mais lorsqu'un produit a déjà un prix spécifique, la remise réelle est différente.

Les produits ajoutés au panier avant le début d'une vente flash ne bénéficient pas de la remise lorsque la vente s'active. Le prix du panier est mis en cache et n'est pas recalculé lorsque de nouvelles règles panier deviennent actives.

Les transferts entre entrepôts sont journalisés comme deux événements distincts (diminution + augmentation) au lieu d'un enregistrement de transfert unique. Cela rend le mouvement impossible à tracer.

Les références de commande de plus de 10 caractères sont coupées dans le CSV exporté, car la colonne était définie avec un format à largeur fixe.

Le widget de chat s'affiche toujours en anglais, quelle que soit la langue de la boutique choisie par le client, car le paramètre de locale n'est pas transmis lors de l'initialisation.

Le journal d'activité admin n'a aucun mécanisme de rotation ni de nettoyage. Sur les boutiques actives avec plusieurs administrateurs, la table de logs dépasse 500MB en un an.

Le compte à rebours atteint 00:00:00 puis affiche des valeurs négatives (-00:00:15), car l'heure de fin est calculée côté serveur alors que le compte à rebours s'exécute côté client.

Les descriptions des catégories de cookies (Essentiels, Statistiques, Marketing) sont codées en dur en anglais. Les boutiques multilingues affichent les descriptions en anglais quelle que soit la langue du visiteur.

Lors du téléversement de 3 fichiers à la fois via l'interface glisser-déposer de l'admin, seul le dernier fichier est enregistré. Le gestionnaire d'upload asynchrone utilise le même nom de fichier temporaire pour tous les téléversements simultanés.

Le hook d'export de données RGPD n'inclut pas l'historique des consentements aux cookies du client (date d'acceptation, catégories concernées).

Ajouter un nouveau fichier à un produit déjà en version 3.2 réinitialise le compteur de version à 1.0 au lieu de l'incrémenter automatiquement à 3.3. Le champ de version était réinitialisé lors de la soumission du formulaire.

Les produits affectés à une vente hebdomadaire restent visibles dans la section soldes après la fin de la semaine de promotion, car le cron de nettoyage ne supprime pas les entrées specific_price.

Quand le cache pleine page est actif, tous les visiteurs voient la même page en cache — avec ou sans la bannière de cookies. L'état de la bannière ne peut pas être personnalisé avec un cache côté serveur.

Les URL des articles de blog sont absentes du sitemap XML généré par SEO Revolution. Le module de blog n'enregistre pas ses URL auprès du hook de génération du sitemap.

Changer l'URL simplifiée d'un produit de /old-name à /new-name crée une redirection. La changer à nouveau vers /newest-name crée une chaîne : /old-name → /new-name → /newest-name au lieu de mettre à jour la première redirection.

Lorsqu'un visiteur refuse les cookies, le module bloque TOUTE exécution de scripts, y compris les fonctionnalités essentielles du site comme les opérations du panier et la navigation. Le mécanisme de blocage était trop agressif.

Les langues ajoutées manuellement (hors pack de langues par défaut de PrestaShop) affichent une icône d'image cassée, car le module cherche les images de drapeau dans le répertoire /img/flags/ du thème à partir du code ISO.

Après la réinitialisation de la configuration du module, les groupes d'attributs créés manuellement comme "Matière" ou "Saison" ne réapparaissent pas dans la liste des filtres disponibles. L'opération de réinitialisation vide la table de correspondance mprfilterrevolution_template_item, qui stocke l'association entre groupes d'attributs et modèles de filtres.

Il s'agit d'une limitation de conception — le module ne peut pas distinguer les correspondances de filtres créées par l'utilisateur des correspondances par défaut lors de la réinstallation.

Le contenu de la fenêtre des préférences de cookies déborde du viewport sur mobile, sans possibilité de défilement. L'overlay de la fenêtre intercepte les événements tactiles.

Les produits avec un stock à zéro mais l'option 'autoriser les commandes en rupture de stock' activée apparaissent sous le filtre 'En stock'. Cela déroute les clients qui s'attendent à voir des produits réellement disponibles.

Le tableau de bord d'analyse des recherches ne suit pas les recherches renvoyant zéro résultat, alors qu'elles sont les plus précieuses pour identifier les produits ou contenus manquants.

Le script GA4 s'exécute avant la vérification du consentement aux cookies, car il est chargé via Google Tag Manager, qui s'initialise indépendamment.

Après passage à l'affichage hors taxes, l'ajout d'un produit au panier via AJAX réinitialise les prix en TTC car la réponse AJAX ne respecte pas le cookie du sélecteur.

Les pages de catégorie paginées (page=2, page=3) pointaient leur canonical vers page=1, ce que Google interprète comme une suppression volontaire de doublons. Cela a retiré entièrement les pages paginées de l'index.

Si un nom de produit contient un caractère pipe (|), le parseur du motif de meta title traite tout ce qui suit comme un placeholder de catégorie, tronquant le nom réel.

Un client qui navigue sur la Boutique A puis visite la Boutique B voit des produits de la Boutique A dans sa section 'récemment consultés', qui peuvent ne pas exister ou avoir des prix différents sur la Boutique B.

Une URL canonique personnalisée commençant par http:// est réécrite en https:// lorsque le SSL forcé est activé, ignorant la valeur canonique explicitement configurée.

Le cookie de consentement est défini avec path='/' mais sans attribut domain, ce qui empêche son envoi sur les requêtes des sous-domaines. Sur les boutiques utilisant le préfixe www, le cookie posé sur www.domain.com n'est pas lu sur domain.com.

La bibliothèque d'export XLSX utilise une interpolation de chaînes dépréciée en PHP 8.2, produisant un fichier corrompu.

Les produits sans wholesale_price défini affichent un coût de 0, ce qui fausse le rapport de marge en indiquant 100% de marge.

Le cookie 'afficher une seule fois par visiteur' est défini comme cookie de session au lieu d'un cookie persistant, il est donc effacé à la fermeture du navigateur. Les visiteurs qui reviennent revoient la popup.

L'ajout d'une nouvelle langue à la boutique crée les fichiers sitemap par langue, mais l'index du sitemap (sitemap.xml) n'est pas régénéré pour les inclure.

Des différences d'arrondi entre le calcul de taxes du module (round de PHP) et l'arrondi natif de PrestaShop (Tools::ps_round avec PS_PRICE_ROUND_MODE) provoquent des écarts de 0.01-0.02 par commande dans les rapports de taxes.

Le widget MRR inclut à tort les commandes hors abonnement, ce qui gonfle le revenu récurrent. La requête filtre uniquement par plage de dates, pas par type de commande.

Lorsqu'une page CMS possède une URL simplifiée personnalisée définie via le module, les balises alternate hreflang ne sont pas générées. Les pages produit et catégorie standard fonctionnent correctement.

L'export en masse des factures PDF pour plus de 1000 commandes provoque une erreur d'épuisement mémoire PHP. L'export charge toutes les données de commande en mémoire d'un coup.

Une commande passée à 18 h affiche 'Livraison d'ici jeudi' sur la base d'une expédition le jour même, mais l'heure limite du transporteur est 15 h, ce qui signifie qu'elle part en réalité demain.

Le CSV n'inclut que la colonne du montant total. Les comptables ont besoin de colonnes séparées pour le montant HT, le taux de taxe, le montant de la taxe et le total TTC.

Le mot de passe généré automatiquement est intégré en texte clair dans l'e-mail de bienvenue, ce qui le rend visible dans les aperçus d'e-mails et susceptible d'être mis en cache par les clients de messagerie.

Le rapport multidevises convertit toutes les commandes avec le taux de change du jour au lieu du taux en vigueur au moment de l'achat. Les rapports historiques changent à chaque mise à jour du taux.

Le chargement synchrone du SDK Intercom bloque le thread principal pendant le chargement de la page, ajoutant un délai significatif à la métrique TTI.

La balise hreflang x-default n'est pas générée lorsque la langue par défaut de la boutique a une URL sans préfixe de langue (ex. : /product-name au lieu de /en/product-name).

Le graphique de chiffre d'affaires affiche les prix taxes comprises, ce qui gonfle le chiffre d'affaires rapporté. La requête du rapport ne soustrait pas la taxe de order_total lorsque la boutique affiche les prix TTC.

Lorsqu'un client appartenant à un groupe tarifaire spécial (p. ex. grossiste) utilisait le paiement express, le prix remisé n'était pas appliqué. Le montant Stripe utilisait le prix catalogue au lieu du prix spécifique au groupe.

Les flèches gauche/droite ne permettent pas de passer d'une image à l'autre en mode plein écran. L'écouteur keydown était attaché au conteneur du diaporama, qui ne reçoit pas le focus.

L'ordre des images défini par glisser-déposer dans la galerie est perdu lors de l'enregistrement du produit. Le champ de position n'est pas inclus dans le formulaire d'enregistrement.

Les images téléversées via l'API ne déclenchent pas le hook de génération de miniatures. Les clients voient une icône d'image cassée pour les petites miniatures.

Le geste de pincement pour zoomer sur mobile est intercepté par le zoom natif du navigateur au lieu du zoom de la galerie.

Les paiements par prélèvement SEPA mettent 5–14 jours ouvrés à être réglés. Le webhook charge.succeeded se déclenchait plusieurs jours après le paiement, mais le gestionnaire de statut de commande ne le reconnaissait pas comme la même commande car il faisait correspondre l'ID de charge plutôt que l'ID de payment intent.

Les images WebP sont rejetées lors du téléversement avec l'erreur 'Invalid file format'. La liste des types MIME autorisés n'incluait pas image/webp.

Une augmentation de 10% sur €9.99 donne €10.989, arrondi à €10.99 au lieu du €10.99 attendu (qui devrait en réalité être affiché comme €10.99 mais stocké différemment). Le problème : €19.99 + 10% = €21.989 s'arrondit à €21.99 au lieu de €21.99.

Le chatbot utilise la préférence de langue du navigateur au lieu du contexte de langue actuel de la boutique, affichant des réponses en anglais aux clients francophones sur la boutique française.

L'URL de partage Pinterest ne spécifie pas le paramètre media, donc le crawler de Pinterest choisit la première image qu'il trouve sur la page (souvent le logo ou une bannière) au lieu de l'image produit.

La disposition en masonry laisse des trous quand les images ont des ratios variés. Le placement automatique du CSS grid ne comble pas les espaces vides.

Lorsque des filtres sont appliqués en AJAX sur les pages catégorie, la liste des impressions produits n'est pas mise à jour dans le dataLayer, si bien que GTM ne suit que les produits du chargement initial de la page.

Chaque paiement PayPal Express crée une nouvelle entrée d'adresse, même lorsque le client a déjà une adresse identique enregistrée, inondant le carnet d'adresses de doublons.

Lors de la duplication d'un produit dans le back-office, les valeurs d'attributs globaux du produit source ne sont pas reportées sur le doublon.

La fonction de filigrane modifie l'image originale téléversée au lieu de créer une copie filigranée. Si le filigrane est retiré plus tard, l'image originale est déjà endommagée.

Sur le thème Hummingbird (PS 8+), les boutons de paiement express héritaient d'un border-radius de 0px du reset des boutons du thème, leur donnant un aspect carré au lieu du style arrondi standard de Stripe.

Lorsque le scroll infini charge de nouveaux produits, l'IntersectionObserver du lazy loading ne détecte pas les nouvelles images car elles sont ajoutées au DOM après l'initialisation de l'observer.

Les moyens de paiement qui redirigent vers une passerelle externe (PayPal, virement bancaire) puis reviennent à la page de confirmation ne déclenchent pas l'événement PURCHASE, car le contexte de session est perdu pendant la redirection.

Les scripts de test automatisés qui créent des commandes consomment le quota d'e-mails transactionnels Brevo, car les e-mails de confirmation des commandes de test passent par le même pipeline que les commandes réelles.

Les stories sont des contenus éphémères qui expirent après 24 heures. Le widget d'intégration affiche un état cassé lorsque la story expire, sans repli élégant.

Sur iOS Safari, l'événement touchend se déclenche en même temps que l'événement click, provoquant l'ouverture et la fermeture de la lightbox dans la même frame.

Toutes les modifications de commande apparaissent comme « Modifié par l'administrateur » sans préciser quel compte employé administrateur a effectué le changement.

La fonction d'export CSV utilise une limite codée en dur de 50 caractères pour les noms de produits. Les produits aux noms plus longs sont tronqués.

Les images à l'intérieur de la popup Quick View ne se chargent jamais car l'Intersection Observer ne détecte pas les éléments à l'intérieur d'un overlay modal créé dynamiquement.

La formule du point de commande ne tient pas compte du délai de livraison par fournisseur. Tous les entrepôts affichent la même suggestion de réapprovisionnement, que le fournisseur livre en 2 jours ou en 2 semaines.

Lorsqu'un produit pack est vendu, le stock des produits individuels est décrémenté mais pas le stock des déclinaisons pour des tailles/couleurs spécifiques. Le gestionnaire de packs ne fonctionne qu'au niveau produit, pas au niveau déclinaison.

L'affichage visuel des étoiles arrondit à l'entier le plus proche au lieu d'afficher des demi-étoiles, faisant apparaître une moyenne de 4.4 comme 4.0 étoiles (visuellement trompeur).

Tous les horodatages des mouvements de stock s'affichent en UTC, ce qui est déroutant pour les marchands dans d'autres fuseaux horaires. La requête du rapport n'appliquait pas de conversion de fuseau horaire.

Le scanner de codes-barres utilise les événements clavier pour capturer les codes scannés. Sur Firefox, le timing de l'événement keypress diffère, ce qui fait manquer certains caractères.

La page produit affiche une quantité disponible différente de celle du module d'entrepôt. Le module met en cache les niveaux de stock avec un TTL de 10 minutes, mais la page produit lit directement dans ps_stock_available.

L'alerte de stock bas se déclenche à chaque exécution du cron tant que le stock est sous le seuil, envoyant des e-mails en double.

Le numéro de facture est réservé à la création de la commande mais n'est utilisé que si la facture est générée. Les commandes annulées consomment des numéros, créant des trous dans la séquence.

Recharger ou revisiter la page de confirmation de commande déclenche à nouveau l'événement de conversion Purchase, provoquant un suivi de conversion en double.

Le pixel TikTok s'initialise et déclenche page_view dès le chargement du script, avant que la bannière de consentement aux cookies n'ait été acceptée. Cela viole les exigences de consentement du RGPD.

Le token CAPTCHA est lié à la session serveur, mais les pages en cache n'ont pas de session. Le formulaire envoie un token CAPTCHA valide qui ne correspond à aucune session côté serveur.

L'import des transferts de stock depuis un CSV ignore silencieusement les lignes où la colonne de l'entrepôt d'origine est vide (signifiant 'depuis le fournisseur').

Lorsque deux commandes pour le même produit sont passées simultanément, les deux décrémentent le stock à partir de la même valeur en cache, produisant un stock négatif.

Lorsque CCC est activé, les fichiers CSS/JS compilés ne correspondent pas aux sommes de contrôle d'origine, déclenchant de fausses alertes 'fichier modifié'.

L'activation des en-têtes CSP bloque les scripts tiers, notamment Google Analytics, Stripe.js et les fournisseurs de polices. La politique par défaut est trop stricte.

L'import d'URL personnalisées depuis un fichier CSV ignore les lignes contenant des caractères Unicode (comme ü, ñ, ø) sans aucun message d'erreur. L'import annonce un succès, mais ces URL sont manquantes.

Apple Pay exige un certificat SSL valide. Les boutiques utilisant des certificats auto-signés en développement n'affichent aucun bouton Apple Pay, sans le moindre message d'erreur.

Le scanner de malwares utilise exec() pour la comparaison de fichiers, fonction que de nombreux hébergeurs mutualisés désactivent. Aucune erreur n'est affichée.

Les fichiers de sauvegarde de la base de données sont nommés backup_001.sql, backup_002.sql, ce qui les rend devinables si le répertoire de sauvegarde est exposé.

Une race condition dans le gestionnaire de session employé fait que le module détecte chaque chargement de page comme un nouvel événement de connexion, inondant la boîte e-mail de l'admin.

La liste de modération admin n'affiche que le nom du client et le texte de l'avis, sans la photo ni le nom du produit. Les admins doivent ouvrir chaque avis pour voir à quel produit il correspond.

La bulle de chat Tawk.to et le bouton de retour en haut occupent tous deux le coin inférieur droit et se chevauchent sur toutes les tailles d'écran.

L'audit de sécurité marque tous les fichiers override des modules comme des menaces potentielles, même les fichiers légitimes. Cela génère du bruit dans le rapport.

Des mots de passe courants comme 'Password123!' obtiennent le score 'Fort' parce que le vérificateur ne valide que la longueur et la diversité des caractères, pas les attaques par dictionnaire.

Le limiteur de débit compte les requêtes d'autocomplétion de recherche AJAX comme des tentatives de connexion. Après 10 recherches rapides, l'IP du client est temporairement bloquée.

Lorsqu'un panier contient des produits qui tombent en rupture de stock entre la création du panier et l'envoi de l'e-mail, l'e-mail de panier abandonné affiche des produits que le client ne peut pas acheter.

Les pages de catégorie et les pages de résultats de recherche n'ont pas d'image OG par défaut, ce qui amène les plateformes sociales soit à choisir une image aléatoire de la page, soit à n'afficher rien du tout.

Si le fournisseur SMS est injoignable, les admins ne peuvent pas terminer la connexion 2FA et sont définitivement bloqués.

Lorsque la boutique est derrière Cloudflare, le pare-feu voit les adresses IP de Cloudflare au lieu des IP réelles des visiteurs. Tout le trafic légitime est bloqué.

Depuis le Brexit, le module ne valide que les préfixes de TVA de l'UE via VIES. Les numéros de TVA britanniques (GB) sont rejetés alors que l'API HMRC devrait être utilisée à la place.

Les clients invités reçoivent un lien de téléchargement pointant vers la page du compte client, à laquelle ils n'ont pas accès. Le lien devrait pointer vers la page de suivi de commande invité avec le téléchargement joint.

Les URL S3 présignées expirent par défaut au bout de 15 minutes. Pour les fichiers volumineux (>2GB) sur des connexions lentes, le téléchargement échoue par timeout.

L'intégration du fil affiche les publications comme de simples partages de lien sans images ni descriptions, car l'API LinkedIn renvoie des données minimales pour les aperçus de publications intégrées.

Les produits des catégories exclues contournent la vérification d'exclusion lorsqu'ils sont ajoutés au panier via une URL directe avec le paramètre id_product au lieu de passer par la page produit.

L'extracteur de CSS critique ne parse pas les déclarations de propriétés personnalisées CSS (--var-name: value) et saute tout le bloc de règles qui les contient, omettant des styles au-dessus de la ligne de flottaison.

Le plugin de chat Messenger charge le SDK JavaScript Facebook complet (800KB+) à chaque chargement de page, ce qui pénalise fortement les scores de vitesse.

Les mots de passe générés automatiquement incluent des caractères comme 0, O, 1, l et I, faciles à confondre lorsqu'ils sont lus depuis une lettre de bienvenue imprimée ou un écran mobile.

Lors de la création d'une archive ZIP de plusieurs fichiers numériques, les fichiers dont le nom contient des caractères Unicode (ex. : 'présentation.pdf') sont silencieusement ignorés. La classe ZipArchive nécessite le flag ENC_UTF_8.

La notification affiche 'John Smith from London just purchased...', révélant les vrais noms et localisations des clients sans leur consentement.

L'URL de flux enregistrée auprès de Criteo change lorsque le module est réinstallé, car le paramètre de token est régénéré. Criteo reçoit des erreurs 404 sur l'ancienne URL du flux.

La balise de conversions améliorées envoie l'e-mail du client haché en SHA-256 au chargement de la page, avant que le client n'ait accepté les cookies marketing, en violation du RGPD.

L'éditeur de texte enrichi des notes de version supprime le HTML à l'enregistrement, convertissant le texte mis en forme en texte brut. L'AdminController utilisait strip_tags à l'étape de validation.

Sur les boutiques utilisant l'option 'Passer le statut de commande à Livré pour les produits virtuels', la mise à jour du statut échoue, car le hook du module se déclenche avant la vérification des produits virtuels du cœur.

Lorsqu'un client reprend un téléchargement partiel (requête HTTP Range), le compteur de téléchargements s'incrémente à nouveau, finissant par atteindre la limite de téléchargements.

L'historique de conversation du client est lié à un identifiant de visiteur aléatoire. Lorsqu'un client connecté se déconnecte puis se reconnecte, il reçoit un nouvel identifiant de visiteur et perd son historique de chat.

L'upload de fichiers de produits numériques de plus de 64MB échoue silencieusement — l'interface admin indique un succès mais aucun fichier n'est enregistré. Le problème vient de la valeur par défaut de upload_max_filesize de PHP.

L'e-mail de notification envoyé à l'administrateur de la boutique contient le message du client mais pas le produit concerné par la demande. L'administrateur doit deviner d'après le contexte.

Les liens de téléchargement restent actifs même après l'annulation ou le remboursement de la commande. La validité du lien ne vérifie que la date d'expiration, pas le statut de la commande.

Les fichiers PDF téléchargés sont corrompus (0 octet ou HTML ajouté au début) lorsque la mise en tampon de sortie de PHP est activée par un autre module ou par la configuration du serveur.

Les boutiques utilisant des transitions de page en AJAX déclenchent l'événement page_view d'UET deux fois — une fois au chargement initial et une fois lors de la navigation AJAX — gonflant les compteurs de pages vues dans Microsoft Advertising.

La vérification des votes en double repose sur un cookie de navigateur. Effacer les cookies ou utiliser le mode navigation privée permet de voter un nombre illimité de fois pour la même demande de fonctionnalité.

La vérification d'expiration du lien de téléchargement utilise l'heure du serveur alors que la génération du lien utilise l'heure de la boutique. Sur les serveurs où le fuseau horaire PHP diffère de celui de la boutique, les liens peuvent expirer avant que le client ne clique dessus.

Si l'employé qui a créé l'article a des champs de nom vides, la ligne d'auteur affiche seulement '—' ou reste vide.

Après la modification d'un article de blog dans le back-office, le front-office continue d'afficher l'ancien contenu jusqu'à ce que le cache soit vidé manuellement. La clé de cache n'inclut pas l'horodatage de mise à jour de l'article.

Après l'activation du SSL, les images intégrées dans le contenu des articles référencent encore des URL en http://, provoquant des avertissements de contenu mixte et des images cassées.

L'import CSV ne met à jour que le prix de base du produit, en ignorant les impacts de prix au niveau des déclinaisons inclus dans le CSV. Les prix des déclinaisons restent inchangés.

Les catégories de blog imbriquées sur plus de 2 niveaux (ex. : News > Tech > AI) ne sont pas visibles dans l'arborescence des catégories de l'admin. La requête récursive avait une limite de profondeur codée en dur à 2.

Le compteur de ventes s'incrémente à la création de la commande mais ne décrémente jamais lorsque des commandes sont annulées ou remboursées, affichant un total gonflé.

Les animations déclenchées au défilement avec un délai (p. ex. des révélations de cartes échelonnées) ne se jouent jamais si l'utilisateur dépasse l'élément avant l'expiration du délai, laissant des espaces vides.

Les produits qui n'ont que des images au format WebP sont exclus du sitemap d'images car le générateur ne filtre que les extensions .jpg/.png.

Le SDK Klaviyo identifie les visiteurs par leur e-mail dès qu'ils le saisissent dans n'importe quel champ de formulaire (checkout, newsletter, contact), suivant leur historique de navigation sans consentement marketing explicite.

Les articles planifiés pour une publication future sont publiés immédiatement lorsque le fuseau horaire du serveur diffère de celui de la boutique. Le planificateur compare les horodatages sans conversion de fuseau horaire.

Les produits avec écotaxe affichent le montant de l'écotaxe soustrait deux fois en mode hors taxes car l'écotaxe est déjà exclue du prix HT.

Le widget de produits associés en bas des articles de blog affiche des produits de toutes les boutiques au lieu de la boutique courante uniquement.

Le lien au protocole signal:// ne fonctionne pas sur les navigateurs de bureau à moins que Signal Desktop ne soit installé, sans aucun retour à l'utilisateur sur ce qui n'a pas fonctionné.

Les hébergeurs appliquant des en-têtes X-Frame-Options: SAMEORIGIN stricts bloquent le chargement de l'iframe du widget Discord, affichant un espace vide à la place.

Les caractères comme & et " dans la seconde description de catégorie apparaissent sous leur forme encodée (&amp;) car Smarty applique l'échappement deux fois — une fois dans le template du module et une fois dans le wrapper du thème.

Cliquer sur 'Page suivante' dans la liste du blog génère une URL comme /blog?page=2 au lieu de /blog/page/2, renvoyant un 404. Les liens de pagination utilisent le mauvais format d'URL lorsque les URL simplifiées sont activées.

L'application d'un filtre via AJAX remplace le contenu de la catégorie, y compris la balise H1, qui revient au nom de catégorie par défaut au lieu du H1 personnalisé.

Les clients des groupes VIP ou grossistes voient les prix normaux pendant le paiement express, car le contexte de groupe n'est pas transmis au prestataire de paiement.

Le script d'initialisation de Zendesk Chat inclut la clé API complète dans une balise script visible, qui pourrait être utilisée pour accéder à l'API de Zendesk Chat.

L'URL de partage est générée à partir d'un token lié à la session. Lorsque le client qui partage supprime ses cookies, le lien partagé devient invalide pour tout le monde.

Lors du traitement d'une demande de suppression de données RGPD, le module ne supprime ni n'anonymise les avis produit publiés du client, laissant son nom et leur contenu visibles.

Une remise fidélité de 15% sur un produit à €0.50 s'arrondit à €0.08 de remise, mais le contrôle du montant minimum de la règle panier échoue et applique €0.00 à la place.

Le nettoyage des comptes invités supprime les entrées invité plus anciennes que le seuil configuré, mais ne vérifie pas si ces invités ont des contenus de panier non expirés. Cela fait perdre des données potentielles de relance de paniers abandonnés.

La sortie du flux RSS contient des balises HTML brutes dans le champ au lieu de texte brut. Certains lecteurs RSS l'affichent incorrectement.

Sur les écrans de moins de 375px de large, la bannière de cookies couvre tout le viewport sans aucun moyen de la faire défiler, bloquant de fait l'ensemble du contenu de la page.

Le formulaire de commentaires s'affiche en bas de chaque article même lorsque l'option 'Autoriser les commentaires' est désactivée dans les réglages du module. Le template vérifiait un réglage par article inexistant au lieu du réglage global.

Sur les navigateurs desktop, un clic sur le bouton WhatsApp ouvre l'interface WhatsApp Web mais le modèle de message prérempli est vide, car l'encodage d'URL utilise + au lieu de %20 pour les espaces.

Lors du partage d'un article de blog sur les réseaux sociaux, l'image à la une de l'article n'est pas incluse dans og:image. La génération des balises meta utilisait la mauvaise méthode pour récupérer l'URL de l'image.

La résolution GeoIP utilise l'IP du serveur proxy au lieu de l'IP réelle du visiteur, ce qui bloque ou redirige des clients légitimes utilisant un VPN d'entreprise.

Les changements de l'API Twitter en 2023 ont cassé le point de terminaison du widget de timeline v1.1. Les timelines intégrées affichent l'état vide générique au lieu des tweets.

Pendant les ventes flash, plusieurs notifications se mettent en file d'attente et s'affichent simultanément, recouvrant le contenu produit et le bouton d'ajout au panier.

Le SDK LiveChat complet et ses ressources (1,2 Mo) se chargent sur chaque page, même lorsque le chat est fermé. Cela impacte fortement les scores de vitesse des pages sur mobile.

Les estimations de livraison comptent les jours fériés comme des jours ouvrés, affichant des dates de livraison trop optimistes (p. ex. 'Livraison d'ici le 25 décembre').

Changer le préfixe de route de /blog à /journal fait que tous les articles existants renvoient 404, car les anciennes URL ne sont pas redirigées.

L'ajout d'un produit au panier déclenche un rafraîchissement de page qui fait perdre tous les filtres sélectionnés. La mise à jour AJAX du panier déclenchait un rechargement complet de la page au lieu d'une mise à jour partielle.

Les images en orientation portrait créent des rangées inégales dans la grille, car le CSS suppose des ratios carrés issus du recadrage par défaut d'Instagram.

La plage du filtre de prix affiche des prix hors taxes même lorsque la boutique est configurée pour afficher les prix TTC. Les clients voient des prix différents dans le filtre et sur les fiches produits.

Si un produit est actif en anglais mais désactivé en français, la balise hreflang pour le français est quand même générée et pointe vers une page 404.

Lorsque ps_facetedsearch est également installé (même désactivé), les URL de filtres du module entrent en conflit, car les deux utilisent le paramètre 'q'.

L'Intelligent Tracking Prevention (ITP) de Safari limite la durée de vie des cookies définis en JavaScript à 7 jours et les bloque entièrement dans les iframes, ce qui fait perdre le cookie de consentement entre les pages.

La mise à jour de la quantité d'un article déjà présent dans le panier déclenche à nouveau l'événement AddToCart, gonflant le nombre d'ajouts au panier dans Pinterest Analytics.

La mise à jour en masse traite toutes les images dans une seule requête HTTP, provoquant un timeout sur les gros catalogues.

Le code de suivi Hotjar est injecté à la fois dans la page parente et dans tous les iframes (passerelles de paiement, captcha, intégrations sociales), créant des enregistrements en double et une surcharge de performance.

Lorsque la logique de filtre est réglée sur AND (tous les critères sélectionnés doivent correspondre), les produits ayant plusieurs attributs du même type renvoient zéro résultat. Le JOIN SQL était incorrect — il fallait un GROUP BY avec HAVING COUNT.

Lorsqu'une commande passe à un statut de workflow personnalisé, l'e-mail de notification utilise le modèle par défaut de PrestaShop au lieu du modèle personnalisé du module, car le répertoire des modèles d'e-mail n'est pas enregistré.

Cliquer rapidement sur les options de filtres provoque des erreurs 'net::ERR_ABORTED', car chaque clic crée un nouveau XHR qui annule le précédent. La liste de produits clignote.

Sur mobile, avec plus de 5 groupes de filtres, le panneau dépasse la hauteur du viewport sans possibilité de défilement. Le conteneur du panneau avait overflow:hidden pour les besoins de l'animation desktop.

Les données structurées FAQ sur les pages catégorie échouent à la validation car le @type est placé à l'intérieur d'un schéma Product au lieu d'une entité FAQPage autonome.

PS 9.0 a changé le format de stockage des couleurs d'attributs. Le module lit la valeur de couleur depuis l'ancienne colonne ps_attribute.color, supprimée dans PS 9.0. Adapté pour lire les données de couleur depuis la nouvelle structure de métadonnées d'attributs, avec un repli sur la colonne classique pour les versions plus anciennes.

L'application de filtres crée des URL du type /category/color-red/size-l que Google indexe comme des pages distinctes. Ces pages filtrées entrent en concurrence avec la page de catégorie principale dans les résultats de recherche.

Sur les installations multiboutique, les filtres d'attributs configurés pour une boutique fuient vers les autres boutiques. La condition id_shop manquait dans la requête de configuration des filtres.

Cliquer sur 'Effacer tous les filtres' réinitialise les produits affichés, mais tous les badges de comptage indiquent (0). La requête de comptage applique encore les paramètres supprimés.

Après application des filtres, le bouton retour du navigateur ne ramène pas à l'état non filtré. L'URL est mise à jour via pushState mais le gestionnaire popstate n'était pas implémenté.

Sélectionner un filtre de couleur via AJAX réinitialise le curseur de plage de prix au min-max au lieu de conserver la plage choisie par l'utilisateur. Les bornes de prix étaient recalculées à partir du catalogue complet au lieu des résultats filtrés.

Les produits dont le nom contient & ou " affichent les entités HTML brutes dans les suggestions d'autocomplétion au lieu des caractères décodés.

Sur les pages catégorie, la liste déroulante de recherche est coupée par le overflow:hidden du conteneur du listing produits.

Les clients qui recherchent par numéro de référence produit ou code-barres n'obtiennent aucun résultat. L'index de recherche n'inclut que le nom, la description et les tags.

Lorsque ps_searchbar est également actif, deux champs de recherche apparaissent et les requêtes AJAX sont déclenchées en double.

Sur Android, appuyer sur le bouton retour alors que l'overlay de recherche est ouvert ramène à la page précédente au lieu de fermer l'overlay.

Après de nombreuses recherches, le cookie stockant l'historique dépasse la limite navigateur de 4 Ko, ce qui fait que tous les cookies sont silencieusement abandonnés. Cela casse la session.

La liste déroulante de filtre par catégorie sur la page de résultats affiche bien les catégories, mais en sélectionner une renvoie tous les résultats au lieu de filtrer. PS 9.0 a modifié la requête de structure de l'arborescence des catégories.

La requête de recherche prend plus de 3 secondes pour les boutiques avec plus de 10 000 produits, car elle joint 5 tables sans indexation adéquate.

L'installation du module échoue sur MySQL 5.7 avec l'erreur 'Cannot create FULLTEXT index'. La table de recherche a été créée avec ROW_FORMAT=COMPRESSED, qui ne prend pas en charge FULLTEXT sur MySQL 5.7.

L'autocomplétion affiche des produits en rupture de stock avec la politique de stock 'refuser la commande'. Les clients cliquent pour découvrir qu'ils ne peuvent pas acheter.

Lorsque la session serveur expire, le point de terminaison de recherche AJAX renvoie une redirection 302 vers la page de connexion en HTML. Le JS frontend tente de l'analyser comme du JSON et lève 'Unexpected token

Les produits mis à jour via l'API WebService de PrestaShop ne déclenchent pas la mise à jour de l'index de recherche. Le module se greffe sur actionProductUpdate, qui n'est pas appelé par l'API.

Lorsque l'en-tête devient sticky au défilement, la liste d'autocomplétion s'affiche derrière lui à cause d'un conflit de z-index. La liste avait un z-index: 100 tandis que l'en-tête sticky utilise z-index: 1000.

Rechercher 'über' ou 'café' ne renvoie aucun résultat alors que des produits contenant ces termes existent. L'index FULLTEXT ne fait pas correspondre les caractères accentués avec leurs équivalents non accentués.

Lorsque PrestaShop est configuré sans préfixes de langue dans les URL (une seule langue par domaine), la balise hreflang x-default est absente. Google Search Console affiche l'avertissement 'missing hreflang x-default'.

Le schéma FAQ émet les éléments Question/Answer à l'intérieur du schéma Product au lieu d'un schéma FAQPage autonome. Google exige FAQPage comme type de premier niveau pour l'éligibilité aux résultats enrichis.

Le calculateur de score SEO divise par zéro lorsque la description du produit est vide, affichant NaN% au lieu d'un score faible.

L'import CSV pour les redirections d'URL en masse expire lorsque le fichier contient plus de 500 lignes. L'import s'exécute dans une seule requête HTTP.

Le module modifie le .htaccess pour les directives robots, mais Nginx ne lit pas les fichiers .htaccess.

Les produits dans des catégories imbriquées (par ex. Home > Clothing > T-Shirts) génèrent des éléments BreadcrumbList en double, car l'arborescence des catégories et la page produit émettent chacune leur propre schéma de fil d'Ariane.

La balise meta og:image est vide sur les pages catégorie, si bien que les partages sur les réseaux sociaux n'affichent aucune image d'aperçu.

Créer une redirection de /old-product vers /old-product/ provoque une boucle de redirection infinie, car le module les traite comme des URL différentes alors que le serveur web les normalise.

Le module se greffe sur displayHeader pour définir les méta-titres, mais PS 9.0 lit les méta-informations plus tôt dans le cycle de vie de la requête. Le hook se déclenche trop tard et le méta-titre personnalisé est ignoré.

Les titres de pages CMS contenant des esperluettes (&) ou des guillemets produisent du XML invalide dans le sitemap. Les URL ne sont pas correctement encodées en XML.

La génération de la méta-description coupe à 120 caractères à cause d'une limite codée en dur héritée de l'époque PS 1.6. Google prend en charge jusqu'à 320 caractères pour les méta-descriptions.

Le schéma JSON-LD Product renvoie le prix catalogue de base au lieu du prix remisé lorsque des règles de prix spécifiques s'appliquent. Google affiche le mauvais prix dans les résultats de recherche.

Si un produit n'est actif qu'en anglais et en allemand mais pas en polonais, la balise hreflang pour le polonais est quand même générée et pointe vers une page 404.

Lorsque le cache Smarty sert une page générée initialement avec un paramètre de session, l'URL canonique contient ?PHPSESSID=xxx. Cela provoque des problèmes de contenu dupliqué dans Google Search Console.

Aucun message d'erreur ne s'affiche lorsque la clé publiable Stripe provient du mode test alors que la clé secrète est en mode live (ou inversement). Le paiement échoue simplement avec une erreur générique.

Le contrôleur de webhook renvoie toujours HTTP 200, même lorsque la création de la commande échoue. Cela empêche Stripe de réessayer les webhooks en échec.

Sur les produits avec déclinaisons (taille/couleur), les boutons de paiement express n'apparaissent qu'une fois une déclinaison sélectionnée. Le prix étant inconnu avant la sélection, le PaymentRequest ne peut pas être initialisé.

Les produits dont le prix est par ex. EUR 9.995 provoquent une erreur Stripe car le montant en centimes (999.5) n'est pas un entier.

Le tableau de bord Stripe affiche l'avertissement 'API version mismatch' car le module utilise une version d'API plus ancienne (2023-10-16).

Après l'ajout d'un produit au panier via AJAX, le mini-panier se rafraîchit mais le bouton de paiement express n'est pas re-rendu. L'initialisation du bouton ne s'exécute qu'au chargement de la page.

L'e-mail de confirmation de commande utilise la langue par défaut de la boutique au lieu de la langue choisie par le client. Le contexte de langue est perdu pendant le traitement du webhook.

Lorsqu'un client a un numéro de TVA dans son adresse, celui-ci n'est pas inclus dans les métadonnées du PaymentIntent Stripe. Cela empêche la génération automatique de factures avec TVA dans Stripe.

PHP 8.2 émet des avertissements de dépréciation pour les propriétés dynamiques. La déclaration de la propriété $secure_key manquait dans l'ObjectModel StripePayment.

Le webhook de litige tente de définir un statut de commande personnalisé qui n'existe pas sur les installations PS 8.1 fraîches. Le statut était créé lors de l'installation du module sur PS 1.7, mais le SQL d'installation ne prenait pas en compte le format de la table des états de commande de PS 8.x.

Le passage du paiement par carte à Apple Pay réinitialise la sélection du transporteur à l'option la moins chère. L'ID du transporteur n'était pas conservé en session entre les changements de mode de paiement.

Lorsque la fonction Combine, Compress, Cache (CCC) de PrestaShop est active, le JS du module se charge avant le SDK Stripe.

Link pré-remplit l'adresse de livraison à partir du profil Stripe du client, qui peut différer de son adresse PrestaShop. Le calcul des frais de port utilise l'adresse Stripe, mais la commande enregistre l'adresse PrestaShop, ce qui provoque un écart de frais de port.

Lorsque le paiement invité est activé et qu'un paiement express aboutit, un compte client est créé sans hash de mot de passe. Le client ne peut ensuite plus se connecter.

Sur les installations multi-boutiques, le gestionnaire de webhook utilise le contexte de la boutique par défaut au lieu de la boutique où la commande a été passée. La commande apparaît alors dans la liste des commandes de la mauvaise boutique.

Les Payment Intents abandonnés s'accumulent dans le tableau de bord Stripe avec le statut 'requires_confirmation'. Ils ne sont jamais nettoyés.

Sur les appareils de moins de 375px de large (iPhone SE, Galaxy Fold), le conteneur du bouton de paiement express déborde et recouvre le prix du produit.

Lorsqu'un remboursement partiel est traité via le tableau de bord Stripe, le gestionnaire de webhook crée une entrée de paiement avec un montant négatif. Le total de la commande s'affiche alors de manière incorrecte dans le back-office.

Le paiement express contourne la page panier standard, si bien que les règles panier accordant la livraison gratuite ne sont jamais évaluées. Les frais de port dans la feuille de paiement affichent toujours le prix du transporteur.

Chrome mobile bloque la fenêtre 3DS de Stripe car elle s'ouvre pendant un callback asynchrone plutôt que suite à un geste direct de l'utilisateur.

Condition de concurrence entre le gestionnaire de l'URL de retour et le webhook : les deux tentent de valider la commande. Le second appel échoue avec l'exception 'Order already validated'.

Après avoir finalisé le paiement PayPal Express, la redirection vers order-confirmation.php échoue avec une page vide. Le problème vient du fait que le callback PayPal met l'ID du panier à null avant que le contrôleur de confirmation de commande ne le lise.

Chaque paiement express crée une nouvelle entrée d'adresse, même lorsque le client possède déjà une adresse identique enregistrée.

Lorsque la devise de la boutique diffère de la devise par défaut du compte Stripe, la feuille Google Pay affiche le mauvais code de devise. Le montant était correct, mais le symbole ISO 4217 était tiré des paramètres du compte Stripe au lieu de la devise du panier PrestaShop.

Safari 17.2 applique une gestion plus stricte des cookies SameSite pendant les callbacks de la Payment Request API. La feuille de paiement Stripe s'ouvre mais ne reçoit pas le total du panier et affiche 'NaN' comme montant.

Chargement...
Retour en haut