diff --git a/src/seo/category_manager.py b/src/seo/category_manager.py index 207818e..3807184 100644 --- a/src/seo/category_manager.py +++ b/src/seo/category_manager.py @@ -132,12 +132,33 @@ class WordPressCategoryManager: } return category_data['id'] - elif response.status_code == 409: - # Category already exists - logger.info(f" Category '{category_name}' already exists") - existing = response.json() - if isinstance(existing, list) and len(existing) > 0: - return existing[0]['id'] + elif response.status_code == 400: + # Category might already exist - search for it + error_data = response.json() + if error_data.get('code') == 'term_exists': + term_id = error_data.get('data', {}).get('term_id') + if term_id: + logger.info(f" Category '{category_name}' already exists (ID: {term_id})") + + # Fetch the category details + cat_response = requests.get( + f"{base_url}/wp-json/wp/v2/categories/{term_id}", + auth=auth, + timeout=10 + ) + if cat_response.status_code == 200: + cat_data = cat_response.json() + # Update cache + if site_name in self.category_cache: + self.category_cache[site_name][cat_data['slug']] = { + 'id': cat_data['id'], + 'name': cat_data['name'], + 'slug': cat_data['slug'], + 'count': cat_data.get('count', 0) + } + return cat_data['id'] + + logger.warning(f" Category already exists or error: {error_data}") return None else: logger.error(f"Error creating category: {response.status_code} - {response.text}") @@ -164,21 +185,42 @@ class WordPressCategoryManager: if site_name not in self.category_cache: self.fetch_categories(site_name) - # Check if category exists - slug = category_name.lower().replace(' ', '-').replace('/', '-') + # Check if category exists (by exact name first) categories = self.category_cache.get(site_name, {}) + # Try exact name match (case-insensitive) + category_name_lower = category_name.lower() + for slug, cat_data in categories.items(): + if cat_data['name'].lower() == category_name_lower: + logger.info(f"✓ Found existing category '{category_name}' (ID: {cat_data['id']})") + return cat_data['id'] + + # Try slug match + slug = category_name.lower().replace(' ', '-').replace('/', '-') if slug in categories: logger.info(f"✓ Found existing category '{category_name}' (ID: {categories[slug]['id']})") return categories[slug]['id'] - # Try alternative slug formats - alt_slug = category_name.lower().replace(' ', '-') - if alt_slug in categories: - logger.info(f"✓ Found existing category '{category_name}' (ID: {categories[alt_slug]['id']})") - return categories[alt_slug]['id'] + # Try alternative slug formats (handle French characters) + import unicodedata + normalized_slug = unicodedata.normalize('NFKD', slug)\ + .encode('ascii', 'ignore')\ + .decode('ascii')\ + .lower()\ + .replace(' ', '-') + + if normalized_slug in categories: + logger.info(f"✓ Found existing category '{category_name}' (ID: {categories[normalized_slug]['id']})") + return categories[normalized_slug]['id'] + + # Try partial match (if slug contains the category name) + for slug, cat_data in categories.items(): + if category_name_lower in cat_data['name'].lower() or cat_data['name'].lower() in category_name_lower: + logger.info(f"✓ Found similar category '{cat_data['name']}' (ID: {cat_data['id']})") + return cat_data['id'] # Create new category + logger.info(f"Creating new category '{category_name}'...") return self.create_category(site_name, category_name, description) def assign_post_to_category(self, site_name: str, post_id: int,