[ka6] fix connecteur maisondherbes.com: refonte du site WooCommerce→Next.js, fiche basculée woocommerce→generic + exclusion opt-in des doublons /en/. Cause racine (2026-09-18): le site a été entièrement refait en Next.js (Turbopack) — WordPress démonté, /wp-json/* répond 404 (vérifié via Scrapfly, l'accès direct est en plus derrière un challenge Cloudflare 403 « Just a moment »); la Store API /wp-json/wc/store/v1/products n'existe plus → 3 syncs en échec. Le nouveau site expose un sitemap.xml (150 produits fr sous /produit/ + 153 doublons anglais sous /en/produit/) et du JSON-LD schema.org Product complet (prix, images, sku, stock) sur chaque fiche → connecteur generic. Fix: (1) fiche stores.json: platform generic + catalog_endpoint __generic__ + skip_url_prefixes ["/en/"]; (2) generic.py/_sitemap_products: nouveau filtre skip_url_prefixes OPT-IN par fiche (jamais global: une 1re version globale « drop /en/ si des URLs racine existent » aurait purgé les boutiques generic à catalogue légitimement anglophone — pierresdailleurs.ca 771/771 produits actifs sous /en/, doucetlatendresse.com 230/232, le1603.com 107/135 — vérifié en base avant d'écrire le filtre). Sync réel 2026-09-18: maisondherbes.com 150 produits (médiane historique 118; les 118 anciennes fiches Woo à external_id numérique désactivées au profit des slugs). Non-régression: pierresdailleurs.ca 800 URLs sitemap dont 800 /en/ conservées, doucetlatendresse.com 232 dont 230 /en/ conservées (sans le flag, aucun filtrage). Web local 200.
2 changed files +14 −3
modified
data/stores.json
+6 −3
@@ -91559,8 +91559,8 @@ | ||
| 91559 | 91559 | "id": "maisondherbes.com", |
| 91560 | 91560 | "name": "Groupe La Feuille Verte", |
| 91561 | 91561 | "url": "https://maisondherbes.com", |
| 91562 | − "platform": "woocommerce", | |
| 91563 | − "catalog_endpoint": "/wp-json/wc/store/v1/products", | |
| 91562 | + "platform": "generic", | |
| 91563 | + "catalog_endpoint": "__generic__", | |
| 91564 | 91564 | "city": "", |
| 91565 | 91565 | "region": "Centre-du-Québec", |
| 91566 | 91566 | "postal_prefix": "J1Z", |
@@ -91598,6 +91598,9 @@ | ||
| 91598 | 91598 | "detail": "Certification Les Produits du Québec", |
| 91599 | 91599 | "source": "lesproduitsduquebec_ent" |
| 91600 | 91600 | } |
| 91601 | + ], | |
| 91602 | + "skip_url_prefixes": [ | |
| 91603 | + "/en/" | |
| 91601 | 91604 | ] |
| 91602 | 91605 | }, |
| 91603 | 91606 | { |
@@ -173762,4 +173765,4 @@ | ||
| 173762 | 173765 | } |
| 173763 | 173766 | } |
| 173764 | 173767 | ] |
| 173765 | −} | |
| 173768 | +} | |
| \ No newline at end of file | ||
modified
fabrika/connectors/generic.py
+8 −0
@@ -220,6 +220,14 @@ class GenericConnector(BaseConnector): | ||
| 220 | 220 | out.append(l) |
| 221 | 221 | if len(out) >= self.max_products * 2: |
| 222 | 222 | break |
| 223 | + # sites bilingues (ex. maisondherbes.com, refonte Next.js fr/en) : le | |
| 224 | + # sitemap liste chaque produit en double sous un préfixe de langue | |
| 225 | + # (/en/…). Exclusion OPT-IN par fiche registre (skip_url_prefixes), | |
| 226 | + # jamais globale : d'autres boutiques génériques ont leur catalogue | |
| 227 | + # légitimement sous /en/ (ex. pierresdailleurs.ca, 771 produits). | |
| 228 | + skip = tuple(self.store.get("skip_url_prefixes") or []) | |
| 229 | + if skip: | |
| 230 | + out = [u for u in out if not urlparse(u).path.startswith(skip)] | |
| 223 | 231 | # dédup en gardant l'ordre |
| 224 | 232 | return list(dict.fromkeys(out))[: self.max_products] |
| 225 | 233 | |
| 226 | 234 | |