[ka6] fix connecteur colorantic.com: l'hébergeur bloque désormais le chemin /wp-json/ (404 serveur, même via Scrapfly) alors que la Store API Woo reste servie via la forme ?rest_route= — ajout d'un fallback rest_route dans le connecteur woocommerce (liste paginée + fiches unitaires du fallback sitemap). Sync réel: 241 produits / 0 erreur (= médiane historique 241); non-régression vérifiée sur cabanedupicbois.com (4 produits, inchangé)
1 changed file +27 −5
modified
fabrika/connectors/woocommerce.py
+27 −5
@@ -16,6 +16,18 @@ from .base import BaseConnector | ||
| 16 | 16 | class WooCommerceConnector(BaseConnector): |
| 17 | 17 | platform = "woocommerce" |
| 18 | 18 | |
| 19 | + # Certains hébergeurs bloquent le chemin /wp-json/ (404 serveur) alors que | |
| 20 | + # l'API REST reste servie via la forme ?rest_route= (ex. colorantic.com). | |
| 21 | + _use_rest_route = False | |
| 22 | + | |
| 23 | + def _store_api_url(self, path: str, query: str = "") -> str: | |
| 24 | + """URL Store API : /wp-json/wc/store/v1/<path> ou ?rest_route= en secours.""" | |
| 25 | + if self._use_rest_route: | |
| 26 | + sep = "&" if query else "" | |
| 27 | + return f"{self.base}/?rest_route=/wc/store/v1/{path}{sep}{query}" | |
| 28 | + sep = "?" if query else "" | |
| 29 | + return f"{self.base}/wp-json/wc/store/v1/{path}{sep}{query}" | |
| 30 | + | |
| 19 | 31 | def _get_items(self, url: str): |
| 20 | 32 | """JSON direct, sinon Scrapfly (Cloudflare & cie) en dernier recours.""" |
| 21 | 33 | try: |
@@ -271,7 +283,7 @@ class WooCommerceConnector(BaseConnector): | ||
| 271 | 283 | out: list[Product] = [] |
| 272 | 284 | for slug in slugs: |
| 273 | 285 | try: |
| 274 | − it = self._get_items(f"{self.base}/wp-json/wc/store/v1/products/{slug}") | |
| 286 | + it = self._get_items(self._store_api_url(f"products/{slug}")) | |
| 275 | 287 | if isinstance(it, dict) and it.get("id"): |
| 276 | 288 | out.append(self._parse_item(it)) |
| 277 | 289 | except Exception: |
@@ -284,11 +296,21 @@ class WooCommerceConnector(BaseConnector): | ||
| 284 | 296 | first_page_exc: Exception | None = None |
| 285 | 297 | while page <= self.max_pages: |
| 286 | 298 | try: |
| 287 | − items = self._get_items(f"{self.base}/wp-json/wc/store/v1/products?per_page=100&page={page}") | |
| 299 | + items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 288 | 300 | except Exception as exc: |
| 289 | − if page == 1: | |
| 290 | − first_page_exc = exc | |
| 291 | − break | |
| 301 | + if page == 1 and not self._use_rest_route: | |
| 302 | + # chemin /wp-json/ bloqué par l'hébergeur ? retenter via ?rest_route= | |
| 303 | + self._use_rest_route = True | |
| 304 | + try: | |
| 305 | + items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 306 | + except Exception: | |
| 307 | + self._use_rest_route = False | |
| 308 | + first_page_exc = exc | |
| 309 | + break | |
| 310 | + else: | |
| 311 | + if page == 1: | |
| 312 | + first_page_exc = exc | |
| 313 | + break | |
| 292 | 314 | if not isinstance(items, list) or not items: |
| 293 | 315 | break |
| 294 | 316 | for it in items: |
| 295 | 317 | |