[ka6] fix connecteur multibrosses.com: le WordPress du site (hébergé Flywheel/Fastly) est en panne depuis le 2026-09-11 au matin — toutes les routes dynamiques PHP (accueil, /shop/, /wp-json/*, ?rest_route=, sitemaps) répondent 200 avec le JSON parasite {"success":true} (seul le statique comme robots.txt survit; confirmé mondial via Scrapfly ASP+render_js, ce n'est pas un blocage anti-bot). Ce dict JSON valide passait le parsing et le connecteur Woo le traitait comme un catalogue vide → sync « ok / 0 produit » trompeur qui a purgé les 141 produits (volume historique). Ajout du garde-fou _get_list() dans woocommerce.py: la liste Store API est toujours un tableau JSON, un objet (erreur Woo {"code":...} ou JSON parasite) lève désormais une erreur → statut error honnête, produits préservés, réintégration auto au retour du site. Sync réel: multibrosses.com error explicite (plus de faux ok/0); non-régression multi-eco.com (8 produits, = prod), artisandulac.ca (448 produits, ~ volume prod), labete.ca (0 sans erreur, chemin _woo_uninstalled intact)
1 changed file +18 −2
modified
fabrika/connectors/woocommerce.py
+18 −2
@@ -323,19 +323,35 @@ class WooCommerceConnector(BaseConnector): | ||
| 323 | 323 | continue |
| 324 | 324 | return out |
| 325 | 325 | |
| 326 | + def _get_list(self, url: str): | |
| 327 | + """Page de la liste Store API — toujours un tableau JSON à la source. | |
| 328 | + | |
| 329 | + Un objet ici = erreur Woo ({"code": ...}) ou site cassé qui sert un | |
| 330 | + JSON parasite en 200 (ex. multibrosses.com sous Flywheel : | |
| 331 | + {"success":true} sur toutes les routes PHP) — c'est une panne, pas un | |
| 332 | + catalogue vide : sans ce garde-fou le sync passe « ok / 0 produit » | |
| 333 | + et purge silencieusement tout le catalogue. | |
| 334 | + """ | |
| 335 | + items = self._get_items(url) | |
| 336 | + if isinstance(items, dict): | |
| 337 | + raise ValueError( | |
| 338 | + f"réponse Store API inattendue (objet au lieu d'une liste): " | |
| 339 | + f"{str(items)[:120]}") | |
| 340 | + return items | |
| 341 | + | |
| 326 | 342 | def fetch(self) -> list[Product]: |
| 327 | 343 | out: list[Product] = [] |
| 328 | 344 | page = 1 |
| 329 | 345 | first_page_exc: Exception | None = None |
| 330 | 346 | while page <= self.max_pages: |
| 331 | 347 | try: |
| 332 | − items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 348 | + items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 333 | 349 | except Exception as exc: |
| 334 | 350 | if page == 1 and not self._use_rest_route: |
| 335 | 351 | # chemin /wp-json/ bloqué par l'hébergeur ? retenter via ?rest_route= |
| 336 | 352 | self._use_rest_route = True |
| 337 | 353 | try: |
| 338 | − items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 354 | + items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 339 | 355 | except Exception: |
| 340 | 356 | self._use_rest_route = False |
| 341 | 357 | first_page_exc = exc |
| 342 | 358 | |