From 4bac1ad5976986f957e2552c71d03a19e2fed610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lohrer?= Date: Wed, 1 Oct 2025 09:49:50 +0200 Subject: [PATCH] Fix: term_exists Fehler - Nutze term_id aus WordPress-Fehlerantwort MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: - Tags/Kategorien wurden als existierend erkannt, aber nicht dem Beitrag zugewiesen - WordPress-API gibt bei 'term_exists'-Fehler die term_id in den Fehler-Daten zurück - Diese term_id wurde nicht genutzt, stattdessen wurde nur erneut gesucht Lösung: - Extrahiere term_id direkt aus error_data['data']['term_id'] - Bei term_exists-Code: Nutze die zurückgegebene term_id - Fallback: Suche erneut falls Extraktion fehlschlägt - Gezielte Suche mit 'search'-Parameter für bessere Performance Verbesserungen: - get_tags() und get_categories() mit optionalem search-Parameter - Debug-Ausgaben: '→ Tag gefunden' statt nur bei Erstellung - Reduziert API-Calls durch gezielte Suche Expected Output: Tags aus Frontmatter: ['OER', 'OEP', ...] → Tag 'OER' gefunden (ID: 3866) → Tag 'OEP' existiert bereits (ID: 3867) Gesamt Tag-IDs: [3866, 3867, ...] --- wordpress_api.py | 66 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/wordpress_api.py b/wordpress_api.py index ba3f63e..59f7773 100644 --- a/wordpress_api.py +++ b/wordpress_api.py @@ -257,10 +257,18 @@ class WordPressAPI: print(f"Details: {e.response.text}") return None - def get_categories(self) -> List[Dict[str, Any]]: - """Holt alle verfügbaren Kategorien""" + def get_categories(self, search: Optional[str] = None) -> List[Dict[str, Any]]: + """ + Holt alle verfügbaren Kategorien oder sucht nach einer bestimmten Kategorie + + Args: + search: Optionaler Suchbegriff + """ try: - response = self._get('categories', params={'per_page': 100}) + params = {'per_page': 100} + if search: + params['search'] = search + response = self._get('categories', params=params) return response.json() except requests.exceptions.RequestException as e: print(f"Fehler beim Abrufen der Kategorien: {e}") @@ -268,9 +276,11 @@ class WordPressAPI: def get_or_create_category(self, name: str) -> Optional[int]: """Holt oder erstellt eine Kategorie""" - categories = self.get_categories() + # Erst gezielt nach dieser Kategorie suchen + categories = self.get_categories(search=name) for cat in categories: if cat['name'].lower() == name.lower(): + print(f" → Kategorie '{name}' gefunden (ID: {cat['id']})") return cat['id'] # Kategorie erstellen @@ -280,12 +290,23 @@ class WordPressAPI: except requests.exceptions.RequestException as e: # Prüfe ob Fehler durch bereits existierende Kategorie if e.response is not None and e.response.status_code == 400: - # Kategorie könnte durch Race Condition gerade erstellt worden sein - # Erneut suchen + try: + error_data = e.response.json() + # WordPress gibt bei 'term_exists' die term_id zurück! + if error_data.get('code') == 'term_exists': + term_id = error_data.get('data', {}).get('term_id') + if term_id: + print(f" → Kategorie '{name}' existiert bereits (ID: {term_id})") + return term_id + except: + pass + + # Fallback: Erneut suchen categories = self.get_categories() for cat in categories: if cat['name'].lower() == name.lower(): return cat['id'] + print(f"Fehler beim Erstellen der Kategorie '{name}': {e}") if hasattr(e, 'response') and e.response is not None: try: @@ -295,10 +316,18 @@ class WordPressAPI: print(f"Response: {e.response.text}") return None - def get_tags(self) -> List[Dict[str, Any]]: - """Holt alle verfügbaren Tags""" + def get_tags(self, search: Optional[str] = None) -> List[Dict[str, Any]]: + """ + Holt alle verfügbaren Tags oder sucht nach einem bestimmten Tag + + Args: + search: Optionaler Suchbegriff + """ try: - response = self._get('tags', params={'per_page': 100}) + params = {'per_page': 100} + if search: + params['search'] = search + response = self._get('tags', params=params) return response.json() except requests.exceptions.RequestException as e: print(f"Fehler beim Abrufen der Tags: {e}") @@ -306,9 +335,11 @@ class WordPressAPI: def get_or_create_tag(self, name: str) -> Optional[int]: """Holt oder erstellt einen Tag""" - tags = self.get_tags() + # Erst gezielt nach diesem Tag suchen + tags = self.get_tags(search=name) for tag in tags: if tag['name'].lower() == name.lower(): + print(f" → Tag '{name}' gefunden (ID: {tag['id']})") return tag['id'] # Tag erstellen @@ -318,12 +349,23 @@ class WordPressAPI: except requests.exceptions.RequestException as e: # Prüfe ob Fehler durch bereits existierenden Tag if e.response is not None and e.response.status_code == 400: - # Tag könnte durch Race Condition gerade erstellt worden sein - # Erneut suchen + try: + error_data = e.response.json() + # WordPress gibt bei 'term_exists' die term_id zurück! + if error_data.get('code') == 'term_exists': + term_id = error_data.get('data', {}).get('term_id') + if term_id: + print(f" → Tag '{name}' existiert bereits (ID: {term_id})") + return term_id + except: + pass + + # Fallback: Erneut suchen tags = self.get_tags() for tag in tags: if tag['name'].lower() == name.lower(): return tag['id'] + print(f"Fehler beim Erstellen des Tags '{name}': {e}") if hasattr(e, 'response') and e.response is not None: try: