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:
parent
74cb36b127
commit
4bac1ad597
1 changed files with 54 additions and 12 deletions
|
|
@ -257,10 +257,18 @@ class WordPressAPI:
|
||||||
print(f"Details: {e.response.text}")
|
print(f"Details: {e.response.text}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_categories(self) -> List[Dict[str, Any]]:
|
def get_categories(self, search: Optional[str] = None) -> List[Dict[str, Any]]:
|
||||||
"""Holt alle verfügbaren Kategorien"""
|
"""
|
||||||
|
Holt alle verfügbaren Kategorien oder sucht nach einer bestimmten Kategorie
|
||||||
|
|
||||||
|
Args:
|
||||||
|
search: Optionaler Suchbegriff
|
||||||
|
"""
|
||||||
try:
|
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()
|
return response.json()
|
||||||
except requests.exceptions.RequestException as e:
|
except requests.exceptions.RequestException as e:
|
||||||
print(f"Fehler beim Abrufen der Kategorien: {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]:
|
def get_or_create_category(self, name: str) -> Optional[int]:
|
||||||
"""Holt oder erstellt eine Kategorie"""
|
"""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:
|
for cat in categories:
|
||||||
if cat['name'].lower() == name.lower():
|
if cat['name'].lower() == name.lower():
|
||||||
|
print(f" → Kategorie '{name}' gefunden (ID: {cat['id']})")
|
||||||
return cat['id']
|
return cat['id']
|
||||||
|
|
||||||
# Kategorie erstellen
|
# Kategorie erstellen
|
||||||
|
|
@ -280,12 +290,23 @@ class WordPressAPI:
|
||||||
except requests.exceptions.RequestException as e:
|
except requests.exceptions.RequestException as e:
|
||||||
# Prüfe ob Fehler durch bereits existierende Kategorie
|
# Prüfe ob Fehler durch bereits existierende Kategorie
|
||||||
if e.response is not None and e.response.status_code == 400:
|
if e.response is not None and e.response.status_code == 400:
|
||||||
# Kategorie könnte durch Race Condition gerade erstellt worden sein
|
try:
|
||||||
# Erneut suchen
|
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()
|
categories = self.get_categories()
|
||||||
for cat in categories:
|
for cat in categories:
|
||||||
if cat['name'].lower() == name.lower():
|
if cat['name'].lower() == name.lower():
|
||||||
return cat['id']
|
return cat['id']
|
||||||
|
|
||||||
print(f"Fehler beim Erstellen der Kategorie '{name}': {e}")
|
print(f"Fehler beim Erstellen der Kategorie '{name}': {e}")
|
||||||
if hasattr(e, 'response') and e.response is not None:
|
if hasattr(e, 'response') and e.response is not None:
|
||||||
try:
|
try:
|
||||||
|
|
@ -295,10 +316,18 @@ class WordPressAPI:
|
||||||
print(f"Response: {e.response.text}")
|
print(f"Response: {e.response.text}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_tags(self) -> List[Dict[str, Any]]:
|
def get_tags(self, search: Optional[str] = None) -> List[Dict[str, Any]]:
|
||||||
"""Holt alle verfügbaren Tags"""
|
"""
|
||||||
|
Holt alle verfügbaren Tags oder sucht nach einem bestimmten Tag
|
||||||
|
|
||||||
|
Args:
|
||||||
|
search: Optionaler Suchbegriff
|
||||||
|
"""
|
||||||
try:
|
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()
|
return response.json()
|
||||||
except requests.exceptions.RequestException as e:
|
except requests.exceptions.RequestException as e:
|
||||||
print(f"Fehler beim Abrufen der Tags: {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]:
|
def get_or_create_tag(self, name: str) -> Optional[int]:
|
||||||
"""Holt oder erstellt einen Tag"""
|
"""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:
|
for tag in tags:
|
||||||
if tag['name'].lower() == name.lower():
|
if tag['name'].lower() == name.lower():
|
||||||
|
print(f" → Tag '{name}' gefunden (ID: {tag['id']})")
|
||||||
return tag['id']
|
return tag['id']
|
||||||
|
|
||||||
# Tag erstellen
|
# Tag erstellen
|
||||||
|
|
@ -318,12 +349,23 @@ class WordPressAPI:
|
||||||
except requests.exceptions.RequestException as e:
|
except requests.exceptions.RequestException as e:
|
||||||
# Prüfe ob Fehler durch bereits existierenden Tag
|
# Prüfe ob Fehler durch bereits existierenden Tag
|
||||||
if e.response is not None and e.response.status_code == 400:
|
if e.response is not None and e.response.status_code == 400:
|
||||||
# Tag könnte durch Race Condition gerade erstellt worden sein
|
try:
|
||||||
# Erneut suchen
|
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()
|
tags = self.get_tags()
|
||||||
for tag in tags:
|
for tag in tags:
|
||||||
if tag['name'].lower() == name.lower():
|
if tag['name'].lower() == name.lower():
|
||||||
return tag['id']
|
return tag['id']
|
||||||
|
|
||||||
print(f"Fehler beim Erstellen des Tags '{name}': {e}")
|
print(f"Fehler beim Erstellen des Tags '{name}': {e}")
|
||||||
if hasattr(e, 'response') and e.response is not None:
|
if hasattr(e, 'response') and e.response is not None:
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue