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: