Fix: term_exists Fehler - Nutze term_id aus WordPress-Fehlerantwort

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, ...]
This commit is contained in:
Jörg Lohrer 2025-10-01 09:49:50 +02:00
parent 74cb36b127
commit 4bac1ad597

View file

@ -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: